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

Delphi控件源码

开发平台:

Delphi

  1.             s.match_start := cur_match;
  2.             best_len := len;
  3.             if (len >= nice_match) then
  4.               break;
  5.   {$IFOPT R+} {$R-} {$DEFINE NoRangeCheck} {$ENDIF}
  6. {$ifdef UNALIGNED_OK}
  7.             scan_end   := pzByteArray(scan)^[best_len-1];
  8. {$else}
  9.             scan_end1  := pzByteArray(scan)^[best_len-1];
  10.             scan_end   := pzByteArray(scan)^[best_len];
  11. {$endif}
  12.   {$IFDEF NoRangeCheck} {$R+} {$UNDEF NoRangeCheck} {$ENDIF}
  13.         end;
  14.     nextstep:
  15.       cur_match := prev^[cur_match and wmask];
  16.       Dec(chain_length);
  17.     until (cur_match <= limit) or (chain_length = 0);
  18.     if (uInt(best_len) <= s.lookahead) then
  19.       longest_match := uInt(best_len)
  20.     else
  21.       longest_match := s.lookahead;
  22. end;
  23. {$endif} { ASMV }
  24. {$else} { FASTEST }
  25. { ---------------------------------------------------------------------------
  26.   Optimized version for level = 1 only }
  27. {local}
  28. function longest_match(var s : deflate_state;
  29.                        cur_match : IPos  { current match }
  30.                        ) : uInt;
  31. var
  32.   {register} scan : pBytef;   { current string }
  33.   {register} match : pBytef;  { matched string }
  34.   {register} len : int;       { length of current match }
  35.   {register} strend : pBytef;
  36. begin
  37.   scan := @s.window^[s.strstart];
  38.   strend := @s.window^[s.strstart + MAX_MATCH];
  39.     { The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
  40.       It is easy to get rid of this optimization if necessary. }
  41.     {$IFDEF DEBUG}
  42.     Assert((s.hash_bits >= 8) and (MAX_MATCH = 258), 'Code too clever');
  43.     Assert(ulg(s.strstart) <= s.window_size-MIN_LOOKAHEAD, 'need lookahead');
  44.     Assert(cur_match < s.strstart, 'no future');
  45.     {$ENDIF}
  46.     match := s.window + cur_match;
  47.     { Return failure if the match length is less than 2: }
  48.     if (match[0] <> scan[0]) or (match[1] <> scan[1]) then
  49.     begin
  50.       longest_match := MIN_MATCH-1;
  51.       exit;
  52.     end;
  53.     { The check at best_len-1 can be removed because it will be made
  54.       again later. (This heuristic is not always a win.)
  55.       It is not necessary to compare scan[2] and match[2] since they
  56.       are always equal when the other bytes match, given that
  57.       the hash keys are equal and that HASH_BITS >= 8. }
  58.     scan += 2, match += 2;
  59.     Assert(scan^ = match^, 'match[2]?');
  60.     { We check for insufficient lookahead only every 8th comparison;
  61.       the 256th check will be made at strstart+258. }
  62.     repeat
  63.       Inc(scan); Inc(match); if scan^<>match^ then break;
  64.       Inc(scan); Inc(match); if scan^<>match^ then break;
  65.       Inc(scan); Inc(match); if scan^<>match^ then break;
  66.       Inc(scan); Inc(match); if scan^<>match^ then break;
  67.       Inc(scan); Inc(match); if scan^<>match^ then break;
  68.       Inc(scan); Inc(match); if scan^<>match^ then break;
  69.       Inc(scan); Inc(match); if scan^<>match^ then break;
  70.       Inc(scan); Inc(match); if scan^<>match^ then break;
  71.     until (ptr2int(scan) >= ptr2int(strend));
  72.     Assert(scan <= s.window+unsigned(s.window_size-1), 'wild scan');
  73.     len := MAX_MATCH - int(strend - scan);
  74.     if (len < MIN_MATCH) then
  75.     begin
  76.       return := MIN_MATCH - 1;
  77.       exit;
  78.     end;
  79.     s.match_start := cur_match;
  80.     if len <= s.lookahead then
  81.       longest_match := len
  82.     else
  83.       longest_match := s.lookahead;
  84. end;
  85. {$endif} { FASTEST }
  86. {$ifdef DEBUG}
  87. { ===========================================================================
  88.   Check that the match at match_start is indeed a match. }
  89. {local}
  90. procedure check_match(var s : deflate_state;
  91.                       start, match : IPos;
  92.                       length : int);
  93. begin
  94.   exit;
  95.   { check that the match is indeed a match }
  96.   if (zmemcmp(pBytef(@s.window^[match]),
  97.               pBytef(@s.window^[start]), length) <> EQUAL) then
  98.   begin
  99.     WriteLn(' start ',start,', match ',match ,' length ', length);
  100.     repeat
  101.       Write(char(s.window^[match]), char(s.window^[start]));
  102.       Inc(match);
  103.       Inc(start);
  104.       Dec(length);
  105.     Until (length = 0);
  106.     z_error('invalid match');
  107.   end;
  108.   if (z_verbose > 1) then
  109.   begin
  110.     Write('\[',start-match,',',length,']');
  111.     repeat
  112.        Write(char(s.window^[start]));
  113.        Inc(start);
  114.        Dec(length);
  115.     Until (length = 0);
  116.   end;
  117. end;
  118. {$endif}
  119. { ===========================================================================
  120.   Fill the window when the lookahead becomes insufficient.
  121.   Updates strstart and lookahead.
  122.   IN assertion: lookahead < MIN_LOOKAHEAD
  123.   OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
  124.      At least one byte has been read, or avail_in = 0; reads are
  125.      performed for at least two bytes (required for the zip translate_eol
  126.      option -- not supported here). }
  127. {local}
  128. procedure fill_window(var s : deflate_state);
  129. var
  130.   {register} n, m : unsigned;
  131.   {register} p : pPosf;
  132.   more : unsigned;    { Amount of free space at the end of the window. }
  133.   wsize : uInt;
  134. begin
  135.    wsize := s.w_size;
  136.    repeat
  137.      more := unsigned(s.window_size -ulg(s.lookahead) -ulg(s.strstart));
  138.      { Deal with !@#$% 64K limit: }
  139.      if (more = 0) and (s.strstart = 0) and (s.lookahead = 0) then
  140.        more := wsize
  141.      else
  142.      if (more = unsigned(-1)) then
  143.      begin
  144.        { Very unlikely, but possible on 16 bit machine if strstart = 0
  145.          and lookahead = 1 (input done one byte at time) }
  146.        Dec(more);
  147.        { If the window is almost full and there is insufficient lookahead,
  148.          move the upper half to the lower one to make room in the upper half.}
  149.      end
  150.      else
  151.        if (s.strstart >= wsize+ {MAX_DIST}wsize-MIN_LOOKAHEAD) then
  152.        begin
  153.          zmemcpy( pBytef(s.window), pBytef(@(s.window^[wsize])),
  154.                  unsigned(wsize));
  155.          Dec(s.match_start, wsize);
  156.          Dec(s.strstart, wsize); { we now have strstart >= MAX_DIST }
  157.          Dec(s.block_start, long(wsize));
  158.          { Slide the hash table (could be avoided with 32 bit values
  159.            at the expense of memory usage). We slide even when level = 0
  160.            to keep the hash table consistent if we switch back to level > 0
  161.            later. (Using level 0 permanently is not an optimal usage of
  162.            zlib, so we don't care about this pathological case.) }
  163.          n := s.hash_size;
  164.          p := @s.head^[n];
  165.          repeat
  166.            Dec(p);
  167.            m := p^;
  168.            if (m >= wsize) then
  169.              p^ := Pos(m-wsize)
  170.            else
  171.              p^ := Pos(ZNIL);
  172.            Dec(n);
  173.          Until (n=0);
  174.          n := wsize;
  175. {$ifndef FASTEST}
  176.          p := @s.prev^[n];
  177.          repeat
  178.            Dec(p);
  179.            m := p^;
  180.            if (m >= wsize) then
  181.              p^ := Pos(m-wsize)
  182.            else
  183.              p^:= Pos(ZNIL);
  184.              { If n is not on any hash chain, prev^[n] is garbage but
  185.                its value will never be used. }
  186.            Dec(n);
  187.          Until (n=0);
  188. {$endif}
  189.          Inc(more, wsize);
  190.      end;
  191.      if (s.strm^.avail_in = 0) then
  192.        exit;
  193.      {* If there was no sliding:
  194.       *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
  195.       *    more == window_size - lookahead - strstart
  196.       * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
  197.       * => more >= window_size - 2*WSIZE + 2
  198.       * In the BIG_MEM or MMAP case (not yet supported),
  199.       *   window_size == input_size + MIN_LOOKAHEAD  &&
  200.       *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
  201.       * Otherwise, window_size == 2*WSIZE so more >= 2.
  202.       * If there was sliding, more >= WSIZE. So in all cases, more >= 2. }
  203.      {$IFDEF DEBUG}
  204.      Assert(more >= 2, 'more < 2');
  205.      {$ENDIF}
  206.      n := read_buf(s.strm, pBytef(@(s.window^[s.strstart + s.lookahead])),
  207.                   more);
  208.      Inc(s.lookahead, n);
  209.      { Initialize the hash value now that we have some input: }
  210.      if (s.lookahead >= MIN_MATCH) then
  211.      begin
  212.        s.ins_h := s.window^[s.strstart];
  213.        {UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]);}
  214.        s.ins_h := ((s.ins_h shl s.hash_shift) xor s.window^[s.strstart+1])
  215.                      and s.hash_mask;
  216. {$ifdef MIN_MATCH <> 3}
  217.        Call UPDATE_HASH() MIN_MATCH-3 more times
  218. {$endif}
  219.      end;
  220.      { If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
  221.        but this is not important since only literal bytes will be emitted. }
  222.    until (s.lookahead >= MIN_LOOKAHEAD) or (s.strm^.avail_in = 0);
  223. end;
  224. { ===========================================================================
  225.   Flush the current block, with given end-of-file flag.
  226.   IN assertion: strstart is set to the end of the current match. }
  227. procedure FLUSH_BLOCK_ONLY(var s : deflate_state; eof : boolean); {macro}
  228. begin
  229.   if (s.block_start >= Long(0)) then
  230.     _tr_flush_block(s, pcharf(@s.window^[unsigned(s.block_start)]),
  231.                     ulg(long(s.strstart) - s.block_start), eof)
  232.   else
  233.     _tr_flush_block(s, pcharf(Z_NULL),
  234.                     ulg(long(s.strstart) - s.block_start), eof);
  235.   s.block_start := s.strstart;
  236.   flush_pending(s.strm^);
  237.   {$IFDEF DEBUG}
  238.   Tracev('[FLUSH]');
  239.   {$ENDIF}
  240. end;
  241. { Same but force premature exit if necessary.
  242. macro FLUSH_BLOCK(var s : deflate_state; eof : boolean) : boolean;
  243. var
  244.   result : block_state;
  245. begin
  246.  FLUSH_BLOCK_ONLY(s, eof);
  247.  if (s.strm^.avail_out = 0) then
  248.  begin
  249.    if eof then
  250.      result := finish_started
  251.    else
  252.      result := need_more;
  253.    exit;
  254.  end;
  255. end;
  256. }
  257. { ===========================================================================
  258.   Copy without compression as much as possible from the input stream, return
  259.   the current block state.
  260.   This function does not insert new strings in the dictionary since
  261.   uncompressible data is probably not useful. This function is used
  262.   only for the level=0 compression option.
  263.   NOTE: this function should be optimized to avoid extra copying from
  264.   window to pending_buf. }
  265. {local}
  266. function deflate_stored(var s : deflate_state; flush : int) : block_state;
  267. { Stored blocks are limited to 0xffff bytes, pending_buf is limited
  268.   to pending_buf_size, and each stored block has a 5 byte header: }
  269. var
  270.   max_block_size : ulg;
  271.   max_start : ulg;
  272. begin
  273.   max_block_size := $ffff;
  274.   if (max_block_size > s.pending_buf_size - 5) then
  275.     max_block_size := s.pending_buf_size - 5;
  276.   { Copy as much as possible from input to output: }
  277.   while TRUE do
  278.   begin
  279.     { Fill the window as much as possible: }
  280.     if (s.lookahead <= 1) then
  281.     begin
  282.       {$IFDEF DEBUG}
  283.       Assert( (s.strstart < s.w_size + {MAX_DIST}s.w_size-MIN_LOOKAHEAD) or
  284.               (s.block_start >= long(s.w_size)), 'slide too late');
  285.       {$ENDIF}
  286.       fill_window(s);
  287.       if (s.lookahead = 0) and (flush = Z_NO_FLUSH) then
  288.       begin
  289.         deflate_stored := need_more;
  290.         exit;
  291.       end;
  292.       if (s.lookahead = 0) then
  293.         break; { flush the current block }
  294.     end;
  295.     {$IFDEF DEBUG}
  296.     Assert(s.block_start >= long(0), 'block gone');
  297.     {$ENDIF}
  298.     Inc(s.strstart, s.lookahead);
  299.     s.lookahead := 0;
  300.     { Emit a stored block if pending_buf will be full: }
  301.     max_start := s.block_start + max_block_size;
  302.     if (s.strstart = 0) or (ulg(s.strstart) >= max_start) then
  303.     begin
  304.       { strstart = 0 is possible when wraparound on 16-bit machine }
  305.       {$WARNINGS OFF}
  306.       s.lookahead := uInt(s.strstart - max_start);
  307.       {$WARNINGS ON}
  308.       s.strstart := uInt(max_start);
  309.       {FLUSH_BLOCK(s, FALSE);}
  310.       FLUSH_BLOCK_ONLY(s, FALSE);
  311.       if (s.strm^.avail_out = 0) then
  312.       begin
  313.         deflate_stored := need_more;
  314.         exit;
  315.       end;
  316.     end;
  317.     { Flush if we may have to slide, otherwise block_start may become
  318.       negative and the data will be gone: }
  319.     if (s.strstart - uInt(s.block_start) >= {MAX_DIST}
  320.         s.w_size-MIN_LOOKAHEAD) then
  321.     begin
  322.       {FLUSH_BLOCK(s, FALSE);}
  323.       FLUSH_BLOCK_ONLY(s, FALSE);
  324.       if (s.strm^.avail_out = 0) then
  325.       begin
  326.         deflate_stored := need_more;
  327.         exit;
  328.       end;
  329.     end;
  330.   end;
  331.   {FLUSH_BLOCK(s, flush = Z_FINISH);}
  332.   FLUSH_BLOCK_ONLY(s, flush = Z_FINISH);
  333.   if (s.strm^.avail_out = 0) then
  334.   begin
  335.     if flush = Z_FINISH then
  336.       deflate_stored := finish_started
  337.     else
  338.       deflate_stored := need_more;
  339.     exit;
  340.   end;
  341.   if flush = Z_FINISH then
  342.     deflate_stored := finish_done
  343.   else
  344.     deflate_stored := block_done;
  345. end;
  346. { ===========================================================================
  347.   Compress as much as possible from the input stream, return the current
  348.   block state.
  349.   This function does not perform lazy evaluation of matches and inserts
  350.   new strings in the dictionary only for unmatched strings or for short
  351.   matches. It is used only for the fast compression options. }
  352. {local}
  353. function deflate_fast(var s : deflate_state; flush : int) : block_state;
  354. var
  355.   hash_head : IPos;     { head of the hash chain }
  356.   bflush : boolean;     { set if current block must be flushed }
  357. begin
  358.   hash_head := ZNIL;
  359.   while TRUE do
  360.   begin
  361.   { Make sure that we always have enough lookahead, except
  362.     at the end of the input file. We need MAX_MATCH bytes
  363.     for the next match, plus MIN_MATCH bytes to insert the
  364.     string following the next match. }
  365.     if (s.lookahead < MIN_LOOKAHEAD) then
  366.     begin
  367.       fill_window(s);
  368.       if (s.lookahead < MIN_LOOKAHEAD) and (flush = Z_NO_FLUSH) then
  369.       begin
  370.         deflate_fast := need_more;
  371.         exit;
  372.       end;
  373.       if (s.lookahead = 0) then
  374.         break; { flush the current block }
  375.     end;
  376.     { Insert the string window[strstart .. strstart+2] in the
  377.       dictionary, and set hash_head to the head of the hash chain: }
  378.     if (s.lookahead >= MIN_MATCH) then
  379.     begin
  380.       INSERT_STRING(s, s.strstart, hash_head);
  381.     end;
  382.     { Find the longest match, discarding those <= prev_length.
  383.       At this point we have always match_length < MIN_MATCH }
  384.     if (hash_head <> ZNIL) and
  385.        (s.strstart - hash_head <= (s.w_size-MIN_LOOKAHEAD){MAX_DIST}) then
  386.     begin
  387.       { To simplify the code, we prevent matches with the string
  388.         of window index 0 (in particular we have to avoid a match
  389.         of the string with itself at the start of the input file). }
  390.       if (s.strategy <> Z_HUFFMAN_ONLY) then
  391.       begin
  392.         s.match_length := longest_match (s, hash_head);
  393.       end;
  394.       { longest_match() sets match_start }
  395.     end;
  396.     if (s.match_length >= MIN_MATCH) then
  397.     begin
  398.       {$IFDEF DEBUG}
  399.       check_match(s, s.strstart, s.match_start, s.match_length);
  400.       {$ENDIF}
  401.       {_tr_tally_dist(s, s.strstart - s.match_start,
  402.                         s.match_length - MIN_MATCH, bflush);}
  403.       bflush := _tr_tally(s, s.strstart - s.match_start,
  404.                         s.match_length - MIN_MATCH);
  405.       Dec(s.lookahead, s.match_length);
  406.       { Insert new strings in the hash table only if the match length
  407.         is not too large. This saves time but degrades compression. }
  408. {$ifndef FASTEST}
  409.       if (s.match_length <= s.max_insert_length)
  410.        and (s.lookahead >= MIN_MATCH) then
  411.       begin
  412.         Dec(s.match_length); { string at strstart already in hash table }
  413.         repeat
  414.           Inc(s.strstart);
  415.           INSERT_STRING(s, s.strstart, hash_head);
  416.           { strstart never exceeds WSIZE-MAX_MATCH, so there are
  417.             always MIN_MATCH bytes ahead. }
  418.           Dec(s.match_length);
  419.         until (s.match_length = 0);
  420.         Inc(s.strstart);
  421.       end
  422.       else
  423. {$endif}
  424.       begin
  425.         Inc(s.strstart, s.match_length);
  426.         s.match_length := 0;
  427.         s.ins_h := s.window^[s.strstart];
  428.         {UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]);}
  429.         s.ins_h := (( s.ins_h shl s.hash_shift) xor
  430.                      s.window^[s.strstart+1]) and s.hash_mask;
  431. if MIN_MATCH <> 3 then   { the linker removes this }
  432. begin
  433.           {Call UPDATE_HASH() MIN_MATCH-3 more times}
  434. end;
  435.         { If lookahead < MIN_MATCH, ins_h is garbage, but it does not
  436.           matter since it will be recomputed at next deflate call. }
  437.       end;
  438.     end
  439.     else
  440.     begin
  441.       { No match, output a literal byte }
  442.       {$IFDEF DEBUG}
  443.       Tracevv(char(s.window^[s.strstart]));
  444.       {$ENDIF}
  445.       {_tr_tally_lit (s, 0, s.window^[s.strstart], bflush);}
  446.       bflush := _tr_tally (s, 0, s.window^[s.strstart]);
  447.       Dec(s.lookahead);
  448.       Inc(s.strstart);
  449.     end;
  450.     if bflush then
  451.     begin  {FLUSH_BLOCK(s, FALSE);}
  452.       FLUSH_BLOCK_ONLY(s, FALSE);
  453.       if (s.strm^.avail_out = 0) then
  454.       begin
  455.         deflate_fast := need_more;
  456.         exit;
  457.       end;
  458.     end;
  459.   end;
  460.   {FLUSH_BLOCK(s, flush = Z_FINISH);}
  461.   FLUSH_BLOCK_ONLY(s, flush = Z_FINISH);
  462.   if (s.strm^.avail_out = 0) then
  463.   begin
  464.     if flush = Z_FINISH then
  465.       deflate_fast := finish_started
  466.     else
  467.       deflate_fast := need_more;
  468.     exit;
  469.   end;
  470.   if flush = Z_FINISH then
  471.     deflate_fast := finish_done
  472.   else
  473.     deflate_fast := block_done;
  474. end;
  475. { ===========================================================================
  476.   Same as above, but achieves better compression. We use a lazy
  477.   evaluation for matches: a match is finally adopted only if there is
  478.   no better match at the next window position. }
  479. {local}
  480. function deflate_slow(var s : deflate_state; flush : int) : block_state;
  481. var
  482.   hash_head : IPos;       { head of hash chain }
  483.   bflush : boolean;       { set if current block must be flushed }
  484. var
  485.   max_insert : uInt;
  486. begin
  487.   hash_head := ZNIL;
  488.   { Process the input block. }
  489.   while TRUE do
  490.   begin
  491.     { Make sure that we always have enough lookahead, except
  492.       at the end of the input file. We need MAX_MATCH bytes
  493.       for the next match, plus MIN_MATCH bytes to insert the
  494.       string following the next match. }
  495.     if (s.lookahead < MIN_LOOKAHEAD) then
  496.     begin
  497.       fill_window(s);
  498.       if (s.lookahead < MIN_LOOKAHEAD) and (flush = Z_NO_FLUSH) then
  499.       begin
  500.         deflate_slow := need_more;
  501.         exit;
  502.       end;
  503.       if (s.lookahead = 0) then
  504.         break; { flush the current block }
  505.     end;
  506.     { Insert the string window[strstart .. strstart+2] in the
  507.       dictionary, and set hash_head to the head of the hash chain: }
  508.     if (s.lookahead >= MIN_MATCH) then
  509.     begin
  510.       INSERT_STRING(s, s.strstart, hash_head);
  511.     end;
  512.     { Find the longest match, discarding those <= prev_length. }
  513.     s.prev_length := s.match_length;
  514.     s.prev_match := s.match_start;
  515.     s.match_length := MIN_MATCH-1;
  516.     if (hash_head <> ZNIL) and (s.prev_length < s.max_lazy_match) and
  517.        (s.strstart - hash_head <= {MAX_DIST}(s.w_size-MIN_LOOKAHEAD)) then
  518.     begin
  519.         { To simplify the code, we prevent matches with the string
  520.           of window index 0 (in particular we have to avoid a match
  521.           of the string with itself at the start of the input file). }
  522.         if (s.strategy <> Z_HUFFMAN_ONLY) then
  523.         begin
  524.           s.match_length := longest_match (s, hash_head);
  525.         end;
  526.         { longest_match() sets match_start }
  527.         if (s.match_length <= 5) and ((s.strategy = Z_FILTERED) or
  528.              ((s.match_length = MIN_MATCH) and
  529.               (s.strstart - s.match_start > TOO_FAR))) then
  530.         begin
  531.             { If prev_match is also MIN_MATCH, match_start is garbage
  532.               but we will ignore the current match anyway. }
  533.             s.match_length := MIN_MATCH-1;
  534.         end;
  535.     end;
  536.     { If there was a match at the previous step and the current
  537.       match is not better, output the previous match: }
  538.     if (s.prev_length >= MIN_MATCH)
  539.       and (s.match_length <= s.prev_length) then
  540.     begin
  541.       max_insert := s.strstart + s.lookahead - MIN_MATCH;
  542.       { Do not insert strings in hash table beyond this. }
  543.       {$ifdef DEBUG}
  544.       check_match(s, s.strstart-1, s.prev_match, s.prev_length);
  545.       {$endif}
  546.       {_tr_tally_dist(s, s->strstart -1 - s->prev_match,
  547.                 s->prev_length - MIN_MATCH, bflush);}
  548.       bflush := _tr_tally(s, s.strstart -1 - s.prev_match,
  549.                            s.prev_length - MIN_MATCH);
  550.       { Insert in hash table all strings up to the end of the match.
  551.         strstart-1 and strstart are already inserted. If there is not
  552.         enough lookahead, the last two strings are not inserted in
  553.         the hash table. }
  554.       Dec(s.lookahead, s.prev_length-1);
  555.       Dec(s.prev_length, 2);
  556.       repeat
  557.         Inc(s.strstart);
  558.         if (s.strstart <= max_insert) then
  559.         begin
  560.           INSERT_STRING(s, s.strstart, hash_head);
  561.         end;
  562.         Dec(s.prev_length);
  563.       until (s.prev_length = 0);
  564.       s.match_available := FALSE;
  565.       s.match_length := MIN_MATCH-1;
  566.       Inc(s.strstart);
  567.       if (bflush) then  {FLUSH_BLOCK(s, FALSE);}
  568.       begin
  569.         FLUSH_BLOCK_ONLY(s, FALSE);
  570.         if (s.strm^.avail_out = 0) then
  571.         begin
  572.           deflate_slow := need_more;
  573.           exit;
  574.         end;
  575.       end;
  576.     end
  577.     else
  578.       if (s.match_available) then
  579.       begin
  580.         { If there was no match at the previous position, output a
  581.           single literal. If there was a match but the current match
  582.           is longer, truncate the previous match to a single literal. }
  583.         {$IFDEF DEBUG}
  584.         Tracevv(char(s.window^[s.strstart-1]));
  585.         {$ENDIF}
  586.         bflush := _tr_tally (s, 0, s.window^[s.strstart-1]);
  587.         if bflush then
  588.         begin
  589.           FLUSH_BLOCK_ONLY(s, FALSE);
  590.         end;
  591.         Inc(s.strstart);
  592.         Dec(s.lookahead);
  593.         if (s.strm^.avail_out = 0) then
  594.         begin
  595.           deflate_slow := need_more;
  596.           exit;
  597.         end;
  598.       end
  599.       else
  600.       begin
  601.         { There is no previous match to compare with, wait for
  602.           the next step to decide. }
  603.         s.match_available := TRUE;
  604.         Inc(s.strstart);
  605.         Dec(s.lookahead);
  606.       end;
  607.   end;
  608.   {$IFDEF DEBUG}
  609.   Assert (flush <> Z_NO_FLUSH, 'no flush?');
  610.   {$ENDIF}
  611.   if (s.match_available) then
  612.   begin
  613.     {$IFDEF DEBUG}
  614.     Tracevv(char(s.window^[s.strstart-1]));
  615.     bflush :=
  616.     {$ENDIF}
  617.       _tr_tally (s, 0, s.window^[s.strstart-1]);
  618.     s.match_available := FALSE;
  619.   end;
  620.   {FLUSH_BLOCK(s, flush = Z_FINISH);}
  621.   FLUSH_BLOCK_ONLY(s, flush = Z_FINISH);
  622.   if (s.strm^.avail_out = 0) then
  623.   begin
  624.     if flush = Z_FINISH then
  625.       deflate_slow := finish_started
  626.     else
  627.       deflate_slow := need_more;
  628.     exit;
  629.   end;
  630.   if flush = Z_FINISH then
  631.     deflate_slow := finish_done
  632.   else
  633.     deflate_slow := block_done;
  634. end;
  635. { Tables for deflate from PKZIP's appnote.txt. }
  636. Const
  637.   border : Array [0..18] Of Word  { Order of the bit length code lengths }
  638.     = (16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15);
  639. { Notes beyond the 1.93a appnote.txt:
  640.    1. Distance pointers never point before the beginning of the output
  641.       stream.
  642.    2. Distance pointers can point back across blocks, up to 32k away.
  643.    3. There is an implied maximum of 7 bits for the bit length table and
  644.       15 bits for the actual data.
  645.    4. If only one code exists, then it is encoded using one bit.  (Zero
  646.       would be more efficient, but perhaps a little confusing.)  If two
  647.       codes exist, they are coded using one bit each (0 and 1).
  648.    5. There is no way of sending zero distance codes--a dummy must be
  649.       sent if there are none.  (History: a pre 2.0 version of PKZIP would
  650.       store blocks with no distance codes, but this was discovered to be
  651.       too harsh a criterion.)  Valid only for 1.93a.  2.04c does allow
  652.       zero distance codes, which is sent as one code of zero bits in
  653.       length.
  654.    6. There are up to 286 literal/length codes.  Code 256 represents the
  655.       end-of-block.  Note however that the static length tree defines
  656.       288 codes just to fill out the Huffman codes.  Codes 286 and 287
  657.       cannot be used though, since there is no length base or extra bits
  658.       defined for them.  Similarily, there are up to 30 distance codes.
  659.       However, static trees define 32 codes (all 5 bits) to fill out the
  660.       Huffman codes, but the last two had better not show up in the data.
  661.    7. Unzip can check dynamic Huffman blocks for complete code sets.
  662.       The exception is that a single code would not be complete (see #4).
  663.    8. The five bits following the block type is really the number of
  664.       literal codes sent minus 257.
  665.    9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
  666.       (1+6+6).  Therefore, to output three times the length, you output
  667.       three codes (1+1+1), whereas to output four times the same length,
  668.       you only need two codes (1+3).  Hmm.
  669.   10. In the tree reconstruction algorithm, Code = Code + Increment
  670.       only if BitLength(i) is not zero.  (Pretty obvious.)
  671.   11. Correction: 4 Bits: # of Bit Length codes - 4     (4 - 19)
  672.   12. Note: length code 284 can represent 227-258, but length code 285
  673.       really is 258.  The last length deserves its own, short code
  674.       since it gets used a lot in very redundant files.  The length
  675.       258 is special since 258 - 3 (the min match length) is 255.
  676.   13. The literal/length and distance code bit lengths are read as a
  677.       single stream of lengths.  It is possible (and advantageous) for
  678.       a repeat code (16, 17, or 18) to go across the boundary between
  679.       the two sets of lengths. }
  680. procedure inflate_blocks_reset (var s : inflate_blocks_state;
  681.                                 var z : z_stream;
  682.                                 c : puLong); { check value on output }
  683. begin
  684.   if (c <> Z_NULL) then
  685.     c^ := s.check;
  686.   if (s.mode = BTREE) or (s.mode = DTREE) then
  687.     ZFREE(z, s.sub.trees.blens);
  688.   if (s.mode = CODES) then
  689.     inflate_codes_free(s.sub.decode.codes, z);
  690.   s.mode := ZTYPE;
  691.   s.bitk := 0;
  692.   s.bitb := 0;
  693.   s.write := s.window;
  694.   s.read := s.window;
  695.   if Assigned(s.checkfn) then
  696.   begin
  697.     s.check := s.checkfn(uLong(0), pBytef(NIL), 0);
  698.     z.adler := s.check;
  699.   end;
  700.   {$IFDEF DEBUG}
  701.   Tracev('inflate:   blocks reset');
  702.   {$ENDIF}
  703. end;
  704. function inflate_blocks_new(var z : z_stream;
  705.                             c : check_func;  { check function }
  706.                             w : uInt         { window size }
  707.                             ) : pInflate_blocks_state;
  708. var
  709.   s : pInflate_blocks_state;
  710. begin
  711.   s := pInflate_blocks_state( ZALLOC(z,1, sizeof(inflate_blocks_state)) );
  712.   if (s = Z_NULL) then
  713.   begin
  714.     inflate_blocks_new := s;
  715.     exit;
  716.   end;
  717.   s^.hufts := huft_ptr( ZALLOC(z, sizeof(inflate_huft), MANY) );
  718.   if (s^.hufts = Z_NULL) then
  719.   begin
  720.     ZFREE(z, s);
  721.     inflate_blocks_new := Z_NULL;
  722.     exit;
  723.   end;
  724.   s^.window := pBytef( ZALLOC(z, 1, w) );
  725.   if (s^.window = Z_NULL) then
  726.   begin
  727.     ZFREE(z, s^.hufts);
  728.     ZFREE(z, s);
  729.     inflate_blocks_new := Z_NULL;
  730.     exit;
  731.   end;
  732.   s^.zend := s^.window;
  733.   Inc(s^.zend, w);
  734.   s^.checkfn := c;
  735.   s^.mode := ZTYPE;
  736.   {$IFDEF DEBUG}  
  737.   Tracev('inflate:   blocks allocated');
  738.   {$ENDIF}
  739.   inflate_blocks_reset(s^, z, Z_NULL);
  740.   inflate_blocks_new := s;
  741. end;
  742. function inflate_blocks (var s : inflate_blocks_state;
  743.                          var z : z_stream;
  744.                          r : int) : int;           { initial return code }
  745. label
  746.   start_btree, start_dtree,
  747.   start_blkdone, start_dry,
  748.   start_codes;
  749. var
  750.   t : uInt;               { temporary storage }
  751.   b : uLong;              { bit buffer }
  752.   k : uInt;               { bits in bit buffer }
  753.   p : pBytef;             { input data pointer }
  754.   n : uInt;               { bytes available there }
  755.   q : pBytef;             { output window write pointer }
  756.   m : uInt;               { bytes to end of window or read pointer }
  757. { fixed code blocks }
  758. var
  759.   bl, bd : uInt;
  760.   tl, td : pInflate_huft;
  761. var
  762.   h : pInflate_huft;
  763.   i, j, c : uInt;
  764. var
  765.   cs : pInflate_codes_state;
  766. begin
  767.   { copy input/output information to locals }
  768.   p := z.next_in;
  769.   n := z.avail_in;
  770.   b := s.bitb;
  771.   k := s.bitk;
  772.   q := s.write;
  773.   if ptr2int(q) < ptr2int(s.read) then
  774.     m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  775.   else
  776.     m := uInt(ptr2int(s.zend)-ptr2int(q));
  777. { decompress an inflated block }
  778.   { process input based on current state }
  779.   while True do
  780.   Case s.mode of
  781.     ZTYPE:
  782.       begin
  783.         {NEEDBITS(3);}
  784.         while (k < 3) do
  785.         begin
  786.           {NEEDBYTE;}
  787.           if (n <> 0) then
  788.             r :=Z_OK
  789.           else
  790.           begin
  791.             {UPDATE}
  792.             s.bitb := b;
  793.             s.bitk := k;
  794.             z.avail_in := n;
  795.             Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  796.             z.next_in := p;
  797.             s.write := q;
  798.             inflate_blocks := inflate_flush(s,z,r);
  799.             exit;
  800.           end;
  801.           Dec(n);
  802.           b := b or (uLong(p^) shl k);
  803.           Inc(p);
  804.           Inc(k, 8);
  805.         end;
  806.         t := uInt(b) and 7;
  807.         s.last := boolean(t and 1);
  808.         case (t shr 1) of
  809.           0:                         { stored }
  810.             begin
  811.               {$IFDEF DEBUG}
  812.               if s.last then
  813.                 Tracev('inflate:     stored block (last)')
  814.               else
  815.                 Tracev('inflate:     stored block');
  816.               {$ENDIF}
  817.               {DUMPBITS(3);}
  818.               b := b shr 3;
  819.               Dec(k, 3);
  820.               t := k and 7;                  { go to byte boundary }
  821.               {DUMPBITS(t);}
  822.               b := b shr t;
  823.               Dec(k, t);
  824.               s.mode := LENS;                { get length of stored block }
  825.             end;
  826.           1:                         { fixed }
  827.             begin
  828.               begin
  829.                 {$IFDEF DEBUG}
  830.                 if s.last then
  831.                   Tracev('inflate:     fixed codes blocks (last)')
  832.                 else
  833.                   Tracev('inflate:     fixed codes blocks');
  834.                 {$ENDIF}
  835.                 inflate_trees_fixed(bl, bd, tl, td, z);
  836.                 s.sub.decode.codes := inflate_codes_new(bl, bd, tl, td, z);
  837.                 if (s.sub.decode.codes = Z_NULL) then
  838.                 begin
  839.                   r := Z_MEM_ERROR;
  840.                   { update pointers and return }
  841.                   s.bitb := b;
  842.                   s.bitk := k;
  843.                   z.avail_in := n;
  844.                   Inc(z.total_in, ptr2int(p) - ptr2int(z.next_in));
  845.                   z.next_in := p;
  846.                   s.write := q;
  847.                   inflate_blocks := inflate_flush(s,z,r);
  848.                   exit;
  849.                 end;
  850.               end;
  851.               {DUMPBITS(3);}
  852.               b := b shr 3;
  853.               Dec(k, 3);
  854.               s.mode := CODES;
  855.             end;
  856.           2:                         { dynamic }
  857.             begin
  858.               {$IFDEF DEBUG}
  859.               if s.last then
  860.                 Tracev('inflate:     dynamic codes block (last)')
  861.               else
  862.                 Tracev('inflate:     dynamic codes block');
  863.               {$ENDIF}                
  864.               {DUMPBITS(3);}
  865.               b := b shr 3;
  866.               Dec(k, 3);
  867.               s.mode := TABLE;
  868.             end;
  869.           3:
  870.             begin                   { illegal }
  871.               {DUMPBITS(3);}
  872.               b := b shr 3;
  873.               Dec(k, 3);
  874.               s.mode := BLKBAD;
  875.               z.msg := 'invalid block type';
  876.               r := Z_DATA_ERROR;
  877.               { update pointers and return }
  878.               s.bitb := b;
  879.               s.bitk := k;
  880.               z.avail_in := n;
  881.               Inc(z.total_in, ptr2int(p) - ptr2int(z.next_in));
  882.               z.next_in := p;
  883.               s.write := q;
  884.               inflate_blocks := inflate_flush(s,z,r);
  885.               exit;
  886.             end;
  887.         end;
  888.       end;
  889.     LENS:
  890.       begin
  891.         {NEEDBITS(32);}
  892.         while (k < 32) do
  893.         begin
  894.           {NEEDBYTE;}
  895.           if (n <> 0) then
  896.             r :=Z_OK
  897.           else
  898.           begin
  899.             {UPDATE}
  900.             s.bitb := b;
  901.             s.bitk := k;
  902.             z.avail_in := n;
  903.             Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  904.             z.next_in := p;
  905.             s.write := q;
  906.             inflate_blocks := inflate_flush(s,z,r);
  907.             exit;
  908.           end;
  909.           Dec(n);
  910.           b := b or (uLong(p^) shl k);
  911.           Inc(p);
  912.           Inc(k, 8);
  913.         end;
  914.         if (((not b) shr 16) and $ffff) <> (b and $ffff) then
  915.         begin
  916.           s.mode := BLKBAD;
  917.           z.msg := 'invalid stored block lengths';
  918.           r := Z_DATA_ERROR;
  919.           { update pointers and return }
  920.           s.bitb := b;
  921.           s.bitk := k;
  922.           z.avail_in := n;
  923.           Inc(z.total_in, ptr2int(p) - ptr2int(z.next_in));
  924.           z.next_in := p;
  925.           s.write := q;
  926.           inflate_blocks := inflate_flush(s,z,r);
  927.           exit;
  928.         end;
  929.         s.sub.left := uInt(b) and $ffff;
  930.         k := 0;
  931.         b := 0;                      { dump bits }
  932.         {$IFDEF DEBUG}
  933.         Tracev('inflate:       stored length '+IntToStr(s.sub.left));
  934.         {$ENDIF}
  935.         if s.sub.left <> 0 then
  936.           s.mode := STORED
  937.         else
  938.           if s.last then
  939.             s.mode := DRY
  940.           else
  941.             s.mode := ZTYPE;
  942.       end;
  943.     STORED:
  944.       begin
  945.         if (n = 0) then
  946.         begin
  947.           { update pointers and return }
  948.           s.bitb := b;
  949.           s.bitk := k;
  950.           z.avail_in := n;
  951.           Inc(z.total_in, ptr2int(p) - ptr2int(z.next_in));
  952.           z.next_in := p;
  953.           s.write := q;
  954.           inflate_blocks := inflate_flush(s,z,r);
  955.           exit;
  956.         end;
  957.         {NEEDOUT}
  958.         if (m = 0) then
  959.         begin
  960.           {WRAP}
  961.           if (q = s.zend) and (s.read <> s.window) then
  962.           begin
  963.             q := s.window;
  964.             if ptr2int(q) < ptr2int(s.read) then
  965.               m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  966.             else
  967.               m := uInt(ptr2int(s.zend)-ptr2int(q));
  968.           end;
  969.           if (m = 0) then
  970.           begin
  971.             {FLUSH}
  972.             s.write := q;
  973.             r := inflate_flush(s,z,r);
  974.             q := s.write;
  975.             if ptr2int(q) < ptr2int(s.read) then
  976.               m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  977.             else
  978.               m := uInt(ptr2int(s.zend)-ptr2int(q));
  979.             {WRAP}
  980.             if (q = s.zend) and (s.read <> s.window) then
  981.             begin
  982.               q := s.window;
  983.               if ptr2int(q) < ptr2int(s.read) then
  984.                 m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  985.               else
  986.                 m := uInt(ptr2int(s.zend)-ptr2int(q));
  987.             end;
  988.             if (m = 0) then
  989.             begin
  990.               {UPDATE}
  991.               s.bitb := b;
  992.               s.bitk := k;
  993.               z.avail_in := n;
  994.               Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  995.               z.next_in := p;
  996.               s.write := q;
  997.               inflate_blocks := inflate_flush(s,z,r);
  998.               exit;
  999.             end;
  1000.           end;
  1001.         end;
  1002.         r := Z_OK;
  1003.         t := s.sub.left;
  1004.         if (t > n) then
  1005.           t := n;
  1006.         if (t > m) then
  1007.           t := m;
  1008.         zmemcpy(q, p, t);
  1009.         Inc(p, t);  Dec(n, t);
  1010.         Inc(q, t);  Dec(m, t);
  1011.         Dec(s.sub.left, t);
  1012.         if (s.sub.left = 0) then
  1013.         begin
  1014.           {$IFDEF DEBUG}
  1015.           if (ptr2int(q) >= ptr2int(s.read)) then
  1016.             Tracev('inflate:       stored end '+
  1017.                 IntToStr(z.total_out + ptr2int(q) - ptr2int(s.read)) + ' total out')
  1018.           else
  1019.             Tracev('inflate:       stored end '+
  1020.                     IntToStr(z.total_out + ptr2int(s.zend) - ptr2int(s.read) +
  1021.                     ptr2int(q) - ptr2int(s.window)) +  ' total out');
  1022.           {$ENDIF}
  1023.           if s.last then
  1024.             s.mode := DRY
  1025.           else
  1026.             s.mode := ZTYPE;
  1027.         end;
  1028.       end;
  1029.     TABLE:
  1030.       begin
  1031.         {NEEDBITS(14);}
  1032.         while (k < 14) do
  1033.         begin
  1034.           {NEEDBYTE;}
  1035.           if (n <> 0) then
  1036.             r :=Z_OK
  1037.           else
  1038.           begin
  1039.             {UPDATE}
  1040.             s.bitb := b;
  1041.             s.bitk := k;
  1042.             z.avail_in := n;
  1043.             Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1044.             z.next_in := p;
  1045.             s.write := q;
  1046.             inflate_blocks := inflate_flush(s,z,r);
  1047.             exit;
  1048.           end;
  1049.           Dec(n);
  1050.           b := b or (uLong(p^) shl k);
  1051.           Inc(p);
  1052.           Inc(k, 8);
  1053.         end;
  1054.         t := uInt(b) and $3fff;
  1055.         s.sub.trees.table := t;
  1056.   {$ifndef PKZIP_BUG_WORKAROUND}
  1057.         if ((t and $1f) > 29) or (((t shr 5) and $1f) > 29) then
  1058.         begin
  1059.           s.mode := BLKBAD;
  1060.           z.msg := 'too many length or distance symbols';
  1061.           r := Z_DATA_ERROR;
  1062.           { update pointers and return }
  1063.           s.bitb := b;
  1064.           s.bitk := k;
  1065.           z.avail_in := n;
  1066.           Inc(z.total_in, ptr2int(p) - ptr2int(z.next_in));
  1067.           z.next_in := p;
  1068.           s.write := q;
  1069.           inflate_blocks := inflate_flush(s,z,r);
  1070.           exit;
  1071.         end;
  1072.   {$endif}
  1073.         t := 258 + (t and $1f) + ((t shr 5) and $1f);
  1074.         s.sub.trees.blens := puIntArray( ZALLOC(z, t, sizeof(uInt)) );
  1075.         if (s.sub.trees.blens = Z_NULL) then
  1076.         begin
  1077.           r := Z_MEM_ERROR;
  1078.           { update pointers and return }
  1079.           s.bitb := b;
  1080.           s.bitk := k;
  1081.           z.avail_in := n;
  1082.           Inc(z.total_in, ptr2int(p) - ptr2int(z.next_in));
  1083.           z.next_in := p;
  1084.           s.write := q;
  1085.           inflate_blocks := inflate_flush(s,z,r);
  1086.           exit;
  1087.         end;
  1088.         {DUMPBITS(14);}
  1089.         b := b shr 14;
  1090.         Dec(k, 14);
  1091.         s.sub.trees.index := 0;
  1092.         {$IFDEF DEBUG}
  1093.         Tracev('inflate:       table sizes ok');
  1094.         {$ENDIF}
  1095.         s.mode := BTREE;
  1096.         { fall trough case is handled by the while }
  1097.         { try GOTO for speed - Nomssi }
  1098.         goto start_btree;
  1099.       end;
  1100.     BTREE:
  1101.       begin
  1102.         start_btree:
  1103.         while (s.sub.trees.index < 4 + (s.sub.trees.table shr 10)) do
  1104.         begin
  1105.           {NEEDBITS(3);}
  1106.           while (k < 3) do
  1107.           begin
  1108.             {NEEDBYTE;}
  1109.             if (n <> 0) then
  1110.               r :=Z_OK
  1111.             else
  1112.             begin
  1113.               {UPDATE}
  1114.               s.bitb := b;
  1115.               s.bitk := k;
  1116.               z.avail_in := n;
  1117.               Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1118.               z.next_in := p;
  1119.               s.write := q;
  1120.               inflate_blocks := inflate_flush(s,z,r);
  1121.               exit;
  1122.             end;
  1123.             Dec(n);
  1124.             b := b or (uLong(p^) shl k);
  1125.             Inc(p);
  1126.             Inc(k, 8);
  1127.           end;
  1128.           s.sub.trees.blens^[border[s.sub.trees.index]] := uInt(b) and 7;
  1129.           Inc(s.sub.trees.index);
  1130.           {DUMPBITS(3);}
  1131.           b := b shr 3;
  1132.           Dec(k, 3);
  1133.         end;
  1134.         while (s.sub.trees.index < 19) do
  1135.         begin
  1136.           s.sub.trees.blens^[border[s.sub.trees.index]] := 0;
  1137.           Inc(s.sub.trees.index);
  1138.         end;
  1139.         s.sub.trees.bb := 7;
  1140.         t := inflate_trees_bits(s.sub.trees.blens^, s.sub.trees.bb,
  1141.                                 s.sub.trees.tb, s.hufts^, z);
  1142.         if (t <> Z_OK) then
  1143.         begin
  1144.           ZFREE(z, s.sub.trees.blens);
  1145.           r := t;
  1146.           if (r = Z_DATA_ERROR) then
  1147.             s.mode := BLKBAD;
  1148.           { update pointers and return }
  1149.           s.bitb := b;
  1150.           s.bitk := k;
  1151.           z.avail_in := n;
  1152.           Inc(z.total_in, ptr2int(p) - ptr2int(z.next_in));
  1153.           z.next_in := p;
  1154.           s.write := q;
  1155.           inflate_blocks := inflate_flush(s,z,r);
  1156.           exit;
  1157.         end;
  1158.         s.sub.trees.index := 0;
  1159.         {$IFDEF DEBUG}
  1160.         Tracev('inflate:       bits tree ok');
  1161.         {$ENDIF}
  1162.         s.mode := DTREE;
  1163.         { fall through again }
  1164.         goto start_dtree;
  1165.       end;
  1166.     DTREE:
  1167.       begin
  1168.         start_dtree:
  1169.         while TRUE do
  1170.         begin
  1171.           t := s.sub.trees.table;
  1172.           if not (s.sub.trees.index < 258 +
  1173.                                      (t and $1f) + ((t shr 5) and $1f)) then
  1174.             break;
  1175.           t := s.sub.trees.bb;
  1176.           {NEEDBITS(t);}
  1177.           while (k < t) do
  1178.           begin
  1179.             {NEEDBYTE;}
  1180.             if (n <> 0) then
  1181.               r :=Z_OK
  1182.             else
  1183.             begin
  1184.               {UPDATE}
  1185.               s.bitb := b;
  1186.               s.bitk := k;
  1187.               z.avail_in := n;
  1188.               Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1189.               z.next_in := p;
  1190.               s.write := q;
  1191.               inflate_blocks := inflate_flush(s,z,r);
  1192.               exit;
  1193.             end;
  1194.             Dec(n);
  1195.             b := b or (uLong(p^) shl k);
  1196.             Inc(p);
  1197.             Inc(k, 8);
  1198.           end;
  1199.           h := s.sub.trees.tb;
  1200.           Inc(h, uInt(b) and inflate_mask[t]);
  1201.           t := h^.Bits;
  1202.           c := h^.Base;
  1203.           if (c < 16) then
  1204.           begin
  1205.             {DUMPBITS(t);}
  1206.             b := b shr t;
  1207.             Dec(k, t);
  1208.             s.sub.trees.blens^[s.sub.trees.index] := c;
  1209.             Inc(s.sub.trees.index);
  1210.           end
  1211.           else { c = 16..18 }
  1212.           begin
  1213.             if c = 18 then
  1214.             begin
  1215.               i := 7;
  1216.               j := 11;
  1217.             end
  1218.             else
  1219.             begin
  1220.               i := c - 14;
  1221.               j := 3;
  1222.             end;
  1223.             {NEEDBITS(t + i);}
  1224.             while (k < t + i) do
  1225.             begin
  1226.               {NEEDBYTE;}
  1227.               if (n <> 0) then
  1228.                 r :=Z_OK
  1229.               else
  1230.               begin
  1231.                 {UPDATE}
  1232.                 s.bitb := b;
  1233.                 s.bitk := k;
  1234.                 z.avail_in := n;
  1235.                 Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1236.                 z.next_in := p;
  1237.                 s.write := q;
  1238.                 inflate_blocks := inflate_flush(s,z,r);
  1239.                 exit;
  1240.               end;
  1241.               Dec(n);
  1242.               b := b or (uLong(p^) shl k);
  1243.               Inc(p);
  1244.               Inc(k, 8);
  1245.             end;
  1246.             {DUMPBITS(t);}
  1247.             b := b shr t;
  1248.             Dec(k, t);
  1249.             Inc(j, uInt(b) and inflate_mask[i]);
  1250.             {DUMPBITS(i);}
  1251.             b := b shr i;
  1252.             Dec(k, i);
  1253.             i := s.sub.trees.index;
  1254.             t := s.sub.trees.table;
  1255.             if (i + j > 258 + (t and $1f) + ((t shr 5) and $1f)) or
  1256.                ((c = 16) and (i < 1)) then
  1257.             begin
  1258.               ZFREE(z, s.sub.trees.blens);
  1259.               s.mode := BLKBAD;
  1260.               z.msg := 'invalid bit length repeat';
  1261.               r := Z_DATA_ERROR;
  1262.               { update pointers and return }
  1263.               s.bitb := b;
  1264.               s.bitk := k;
  1265.               z.avail_in := n;
  1266.               Inc(z.total_in, ptr2int(p) - ptr2int(z.next_in));
  1267.               z.next_in := p;
  1268.               s.write := q;
  1269.               inflate_blocks := inflate_flush(s,z,r);
  1270.               exit;
  1271.             end;
  1272.             if c = 16 then
  1273.               c := s.sub.trees.blens^[i - 1]
  1274.             else
  1275.               c := 0;
  1276.             repeat
  1277.               s.sub.trees.blens^[i] := c;
  1278.               Inc(i);
  1279.               Dec(j);
  1280.             until (j=0);
  1281.             s.sub.trees.index := i;
  1282.           end;
  1283.         end; { while }
  1284.         s.sub.trees.tb := Z_NULL;
  1285.         begin
  1286.           bl := 9;         { must be <= 9 for lookahead assumptions }
  1287.           bd := 6;         { must be <= 9 for lookahead assumptions }
  1288.           t := s.sub.trees.table;
  1289.           t := inflate_trees_dynamic(257 + (t and $1f),
  1290.                   1 + ((t shr 5) and $1f),
  1291.                   s.sub.trees.blens^, bl, bd, tl, td, s.hufts^, z);
  1292.           ZFREE(z, s.sub.trees.blens);
  1293.           if (t <> Z_OK) then
  1294.           begin
  1295.             if (t = uInt(Z_DATA_ERROR)) then
  1296.               s.mode := BLKBAD;
  1297.             r := t;
  1298.             { update pointers and return }
  1299.             s.bitb := b;
  1300.             s.bitk := k;
  1301.             z.avail_in := n;
  1302.             Inc(z.total_in, ptr2int(p) - ptr2int(z.next_in));
  1303.             z.next_in := p;
  1304.             s.write := q;
  1305.             inflate_blocks := inflate_flush(s,z,r);
  1306.             exit;
  1307.           end;
  1308.           {$IFDEF DEBUG}
  1309.           Tracev('inflate:       trees ok');
  1310.           {$ENDIF}          
  1311.           { c renamed to cs }
  1312.           cs := inflate_codes_new(bl, bd, tl, td, z);
  1313.           if (cs = Z_NULL) then
  1314.           begin
  1315.             r := Z_MEM_ERROR;
  1316.             { update pointers and return }
  1317.             s.bitb := b;
  1318.             s.bitk := k;
  1319.             z.avail_in := n;
  1320.             Inc(z.total_in, ptr2int(p) - ptr2int(z.next_in));
  1321.             z.next_in := p;
  1322.             s.write := q;
  1323.             inflate_blocks := inflate_flush(s,z,r);
  1324.             exit;
  1325.           end;
  1326.           s.sub.decode.codes := cs;
  1327.         end;
  1328.         s.mode := CODES;
  1329.         { yet another falltrough }
  1330.         goto start_codes;
  1331.       end;
  1332.     CODES:
  1333.       begin
  1334.         start_codes:
  1335.         { update pointers }
  1336.         s.bitb := b;
  1337.         s.bitk := k;
  1338.         z.avail_in := n;
  1339.         Inc(z.total_in, ptr2int(p) - ptr2int(z.next_in));
  1340.         z.next_in := p;
  1341.         s.write := q;
  1342.         r := inflate_codes(s, z, r);
  1343.         if (r <> Z_STREAM_END) then
  1344.         begin
  1345.           inflate_blocks := inflate_flush(s, z, r);
  1346.           exit;
  1347.         end;
  1348.         r := Z_OK;
  1349.         inflate_codes_free(s.sub.decode.codes, z);
  1350.         { load local pointers }
  1351.         p := z.next_in;
  1352.         n := z.avail_in;
  1353.         b := s.bitb;
  1354.         k := s.bitk;
  1355.         q := s.write;
  1356.         if ptr2int(q) < ptr2int(s.read) then
  1357.           m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  1358.         else
  1359.           m := uInt(ptr2int(s.zend)-ptr2int(q));
  1360.         {$IFDEF DEBUG}
  1361.         if (ptr2int(q) >= ptr2int(s.read)) then
  1362.           Tracev('inflate:       codes end '+
  1363.               IntToStr(z.total_out + ptr2int(q) - ptr2int(s.read)) + ' total out')
  1364.         else
  1365.           Tracev('inflate:       codes end '+
  1366.                   IntToStr(z.total_out + ptr2int(s.zend) - ptr2int(s.read) +
  1367.                   ptr2int(q) - ptr2int(s.window)) +  ' total out');
  1368.         {$ENDIF}
  1369.         if (not s.last) then
  1370.         begin
  1371.           s.mode := ZTYPE;
  1372.           continue; { break for switch statement in C-code }
  1373.         end;
  1374.         {$ifndef patch112}
  1375.         if (k > 7) then           { return unused byte, if any }
  1376.         begin
  1377.           {$IFDEF DEBUG}
  1378.           Assert(k < 16, 'inflate_codes grabbed too many bytes');
  1379.           {$ENDIF}
  1380.           Dec(k, 8);
  1381.           Inc(n);
  1382.           Dec(p);                    { can always return one }
  1383.         end;
  1384.         {$endif}
  1385.         s.mode := DRY;
  1386.         { another falltrough }
  1387.         goto start_dry;
  1388.       end;
  1389.     DRY:
  1390.       begin
  1391.         start_dry:
  1392.         {FLUSH}
  1393.         s.write := q;
  1394.         r := inflate_flush(s,z,r);
  1395.         q := s.write;
  1396.         { not needed anymore, we are done:
  1397.         if ptr2int(q) < ptr2int(s.read) then
  1398.           m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  1399.         else
  1400.           m := uInt(ptr2int(s.zend)-ptr2int(q));
  1401.         }
  1402.         if (s.read <> s.write) then
  1403.         begin
  1404.           { update pointers and return }
  1405.           s.bitb := b;
  1406.           s.bitk := k;
  1407.           z.avail_in := n;
  1408.           Inc(z.total_in, ptr2int(p) - ptr2int(z.next_in));
  1409.           z.next_in := p;
  1410.           s.write := q;
  1411.           inflate_blocks := inflate_flush(s,z,r);
  1412.           exit;
  1413.         end;
  1414.         s.mode := BLKDONE;
  1415.         goto start_blkdone;
  1416.       end;
  1417.     BLKDONE:
  1418.       begin
  1419.         start_blkdone:
  1420.         r := Z_STREAM_END;
  1421.         { update pointers and return }
  1422.         s.bitb := b;
  1423.         s.bitk := k;
  1424.         z.avail_in := n;
  1425.         Inc(z.total_in, ptr2int(p) - ptr2int(z.next_in));
  1426.         z.next_in := p;
  1427.         s.write := q;
  1428.         inflate_blocks := inflate_flush(s,z,r);
  1429.         exit;
  1430.       end;
  1431.     BLKBAD:
  1432.       begin
  1433.         r := Z_DATA_ERROR;
  1434.         { update pointers and return }
  1435.         s.bitb := b;
  1436.         s.bitk := k;
  1437.         z.avail_in := n;
  1438.         Inc(z.total_in, ptr2int(p) - ptr2int(z.next_in));
  1439.         z.next_in := p;
  1440.         s.write := q;
  1441.         inflate_blocks := inflate_flush(s,z,r);
  1442.         exit;
  1443.       end;
  1444.     else
  1445.     begin
  1446.       r := Z_STREAM_ERROR;
  1447.       { update pointers and return }
  1448.       s.bitb := b;
  1449.       s.bitk := k;
  1450.       z.avail_in := n;
  1451.       Inc(z.total_in, ptr2int(p) - ptr2int(z.next_in));
  1452.       z.next_in := p;
  1453.       s.write := q;
  1454.       inflate_blocks := inflate_flush(s,z,r);
  1455.       exit;
  1456.     end;
  1457.   end; { Case s.mode of }
  1458. end;
  1459. function inflate_blocks_free(s : pInflate_blocks_state;
  1460.                              var z : z_stream) : int;
  1461. begin
  1462.   inflate_blocks_reset(s^, z, Z_NULL);
  1463.   ZFREE(z, s^.window);
  1464.   ZFREE(z, s^.hufts);
  1465.   ZFREE(z, s);
  1466.   {$IFDEF DEBUG}
  1467.   Trace('inflate:   blocks freed');
  1468.   {$ENDIF}  
  1469.   inflate_blocks_free := Z_OK;
  1470. end;
  1471. procedure inflate_set_dictionary(var s : inflate_blocks_state;
  1472.                                  const d : array of byte; { dictionary }
  1473.                                  n : uInt);         { dictionary length }
  1474. begin
  1475.   zmemcpy(s.window, pBytef(@d), n);
  1476.   s.write := s.window;
  1477.   Inc(s.write, n);
  1478.   s.read := s.write;
  1479. end;
  1480. { Returns true if inflate is currently at the end of a block generated
  1481.   by Z_SYNC_FLUSH or Z_FULL_FLUSH.
  1482.   IN assertion: s <> Z_NULL }
  1483. function inflate_blocks_sync_point(var s : inflate_blocks_state) : int;
  1484. begin
  1485.   inflate_blocks_sync_point := int(s.mode = LENS);
  1486. end;
  1487. function inflate_codes_new (bl : uInt;
  1488.                             bd : uInt;
  1489.                             tl : pInflate_huft;
  1490.                             td : pInflate_huft;
  1491.                             var z : z_stream): pInflate_codes_state;
  1492. var
  1493.  c : pInflate_codes_state;
  1494. begin
  1495.   c := pInflate_codes_state( ZALLOC(z,1,sizeof(inflate_codes_state)) );
  1496.   if (c <> Z_NULL) then
  1497.   begin
  1498.     c^.mode := START;
  1499.     c^.lbits := Byte(bl);
  1500.     c^.dbits := Byte(bd);
  1501.     c^.ltree := tl;
  1502.     c^.dtree := td;
  1503.     {$IFDEF DEBUG}
  1504.     Tracev('inflate:       codes new');
  1505.     {$ENDIF}
  1506.   end;
  1507.   inflate_codes_new := c;
  1508. end;
  1509. function inflate_codes(var s : inflate_blocks_state;
  1510.                        var z : z_stream;
  1511.                        r : int) : int;
  1512. var
  1513.   j : uInt;               { temporary storage }
  1514.   t : pInflate_huft;      { temporary pointer }
  1515.   e : uInt;               { extra bits or operation }
  1516.   b : uLong;              { bit buffer }
  1517.   k : uInt;               { bits in bit buffer }
  1518.   p : pBytef;             { input data pointer }
  1519.   n : uInt;               { bytes available there }
  1520.   q : pBytef;             { output window write pointer }
  1521.   m : uInt;               { bytes to end of window or read pointer }
  1522.   f : pBytef;             { pointer to copy strings from }
  1523. var
  1524.   c : pInflate_codes_state;
  1525. begin
  1526.   c := s.sub.decode.codes;  { codes state }
  1527.   { copy input/output information to locals }
  1528.   p := z.next_in;
  1529.   n := z.avail_in;
  1530.   b := s.bitb;
  1531.   k := s.bitk;
  1532.   q := s.write;
  1533.   if ptr2int(q) < ptr2int(s.read) then
  1534.     m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  1535.   else
  1536.     m := uInt(ptr2int(s.zend)-ptr2int(q));
  1537.   { process input and output based on current state }
  1538.   while True do
  1539.   case (c^.mode) of
  1540.     { waiting for "i:"=input, "o:"=output, "x:"=nothing }
  1541.   START:         { x: set up for LEN }
  1542.     begin
  1543. {$ifndef SLOW}
  1544.       if (m >= 258) and (n >= 10) then
  1545.       begin
  1546.         {UPDATE}
  1547.         s.bitb := b;
  1548.         s.bitk := k;
  1549.         z.avail_in := n;
  1550.         Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1551.         z.next_in := p;
  1552.         s.write := q;
  1553.         r := inflate_fast(c^.lbits, c^.dbits, c^.ltree, c^.dtree, s, z);
  1554.         {LOAD}
  1555.         p := z.next_in;
  1556.         n := z.avail_in;
  1557.         b := s.bitb;
  1558.         k := s.bitk;
  1559.         q := s.write;
  1560.         if ptr2int(q) < ptr2int(s.read) then
  1561.           m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  1562.         else
  1563.           m := uInt(ptr2int(s.zend)-ptr2int(q));
  1564.         if (r <> Z_OK) then
  1565.         begin
  1566.           if (r = Z_STREAM_END) then
  1567.             c^.mode := WASH
  1568.           else
  1569.             c^.mode := BADCODE;
  1570.           continue;    { break for switch-statement in C }
  1571.         end;
  1572.       end;
  1573. {$endif} { not SLOW }
  1574.       c^.sub.code.need := c^.lbits;
  1575.       c^.sub.code.tree := c^.ltree;
  1576.       c^.mode := LEN;  { falltrough }
  1577.     end;
  1578.   LEN:           { i: get length/literal/eob next }
  1579.     begin
  1580.       j := c^.sub.code.need;
  1581.       {NEEDBITS(j);}
  1582.       while (k < j) do
  1583.       begin
  1584.         {NEEDBYTE;}
  1585.         if (n <> 0) then
  1586.           r :=Z_OK
  1587.         else
  1588.         begin
  1589.           {UPDATE}
  1590.           s.bitb := b;
  1591.           s.bitk := k;
  1592.           z.avail_in := n;
  1593.           Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1594.           z.next_in := p;
  1595.           s.write := q;
  1596.           inflate_codes := inflate_flush(s,z,r);
  1597.           exit;
  1598.         end;
  1599.         Dec(n);
  1600.         b := b or (uLong(p^) shl k);
  1601.         Inc(p);
  1602.         Inc(k, 8);
  1603.       end;
  1604.       t := c^.sub.code.tree;
  1605.       Inc(t, uInt(b) and inflate_mask[j]);
  1606.       {DUMPBITS(t^.bits);}
  1607.       b := b shr t^.bits;
  1608.       Dec(k, t^.bits);
  1609.       e := uInt(t^.exop);
  1610.       if (e = 0) then            { literal }
  1611.       begin
  1612.         c^.sub.lit := t^.base;
  1613.        {$IFDEF DEBUG}
  1614.         if (t^.base >= $20) and (t^.base < $7f) then
  1615.           Tracevv('inflate:         literal '+char(t^.base))
  1616.         else
  1617.           Tracevv('inflate:         literal '+IntToStr(t^.base));
  1618.         {$ENDIF}          
  1619.         c^.mode := LIT;
  1620.         continue;  { break switch statement }
  1621.       end;
  1622.       if (e and 16 <> 0) then            { length }
  1623.       begin
  1624.         c^.sub.copy.get := e and 15;
  1625.         c^.len := t^.base;
  1626.         c^.mode := LENEXT;
  1627.         continue;         { break C-switch statement }
  1628.       end;
  1629.       if (e and 64 = 0) then             { next table }
  1630.       begin
  1631.         c^.sub.code.need := e;
  1632.         c^.sub.code.tree := @huft_ptr(t)^[t^.base];
  1633.         continue;         { break C-switch statement }
  1634.       end;
  1635.       if (e and 32 <> 0) then            { end of block }
  1636.       begin
  1637.         {$IFDEF DEBUG}
  1638.         Tracevv('inflate:         end of block');
  1639.         {$ENDIF}        
  1640.         c^.mode := WASH;
  1641.         continue;         { break C-switch statement }
  1642.       end;
  1643.       c^.mode := BADCODE;        { invalid code }
  1644.       z.msg := 'invalid literal/length code';
  1645.       r := Z_DATA_ERROR;
  1646.       {UPDATE}
  1647.       s.bitb := b;
  1648.       s.bitk := k;
  1649.       z.avail_in := n;
  1650.       Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1651.       z.next_in := p;
  1652.       s.write := q;
  1653.       inflate_codes := inflate_flush(s,z,r);
  1654.       exit;
  1655.     end;
  1656.   LENEXT:        { i: getting length extra (have base) }
  1657.     begin
  1658.       j := c^.sub.copy.get;
  1659.       {NEEDBITS(j);}
  1660.       while (k < j) do
  1661.       begin
  1662.         {NEEDBYTE;}
  1663.         if (n <> 0) then
  1664.           r :=Z_OK
  1665.         else
  1666.         begin
  1667.           {UPDATE}
  1668.           s.bitb := b;
  1669.           s.bitk := k;
  1670.           z.avail_in := n;
  1671.           Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1672.           z.next_in := p;
  1673.           s.write := q;
  1674.           inflate_codes := inflate_flush(s,z,r);
  1675.           exit;
  1676.         end;
  1677.         Dec(n);
  1678.         b := b or (uLong(p^) shl k);
  1679.         Inc(p);
  1680.         Inc(k, 8);
  1681.       end;
  1682.       Inc(c^.len, uInt(b and inflate_mask[j]));
  1683.       {DUMPBITS(j);}
  1684.       b := b shr j;
  1685.       Dec(k, j);
  1686.       c^.sub.code.need := c^.dbits;
  1687.       c^.sub.code.tree := c^.dtree;
  1688.       {$IFDEF DEBUG}
  1689.       Tracevv('inflate:         length '+IntToStr(c^.len));
  1690.       {$ENDIF}
  1691.       c^.mode := DIST;
  1692.       { falltrough }
  1693.     end;
  1694.   DIST:          { i: get distance next }
  1695.     begin
  1696.       j := c^.sub.code.need;
  1697.       {NEEDBITS(j);}
  1698.       while (k < j) do
  1699.       begin
  1700.         {NEEDBYTE;}
  1701.         if (n <> 0) then
  1702.           r :=Z_OK
  1703.         else
  1704.         begin
  1705.           {UPDATE}
  1706.           s.bitb := b;
  1707.           s.bitk := k;
  1708.           z.avail_in := n;
  1709.           Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1710.           z.next_in := p;
  1711.           s.write := q;
  1712.           inflate_codes := inflate_flush(s,z,r);
  1713.           exit;
  1714.         end;
  1715.         Dec(n);
  1716.         b := b or (uLong(p^) shl k);
  1717.         Inc(p);
  1718.         Inc(k, 8);
  1719.       end;
  1720.       t := @huft_ptr(c^.sub.code.tree)^[uInt(b) and inflate_mask[j]];
  1721.       {DUMPBITS(t^.bits);}
  1722.       b := b shr t^.bits;
  1723.       Dec(k, t^.bits);
  1724.       e := uInt(t^.exop);
  1725.       if (e and 16 <> 0) then            { distance }
  1726.       begin
  1727.         c^.sub.copy.get := e and 15;
  1728.         c^.sub.copy.dist := t^.base;
  1729.         c^.mode := DISTEXT;
  1730.         continue;     { break C-switch statement }
  1731.       end;
  1732.       if (e and 64 = 0) then     { next table }
  1733.       begin
  1734.         c^.sub.code.need := e;
  1735.         c^.sub.code.tree := @huft_ptr(t)^[t^.base];
  1736.         continue;     { break C-switch statement }
  1737.       end;
  1738.       c^.mode := BADCODE;        { invalid code }
  1739.       z.msg := 'invalid distance code';
  1740.       r := Z_DATA_ERROR;
  1741.       {UPDATE}
  1742.       s.bitb := b;
  1743.       s.bitk := k;
  1744.       z.avail_in := n;
  1745.       Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1746.       z.next_in := p;
  1747.       s.write := q;
  1748.       inflate_codes := inflate_flush(s,z,r);
  1749.       exit;
  1750.     end;
  1751.   DISTEXT:       { i: getting distance extra }
  1752.     begin
  1753.       j := c^.sub.copy.get;
  1754.       {NEEDBITS(j);}
  1755.       while (k < j) do
  1756.       begin
  1757.         {NEEDBYTE;}
  1758.         if (n <> 0) then
  1759.           r :=Z_OK
  1760.         else
  1761.         begin
  1762.           {UPDATE}
  1763.           s.bitb := b;
  1764.           s.bitk := k;
  1765.           z.avail_in := n;
  1766.           Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1767.           z.next_in := p;
  1768.           s.write := q;
  1769.           inflate_codes := inflate_flush(s,z,r);
  1770.           exit;
  1771.         end;
  1772.         Dec(n);
  1773.         b := b or (uLong(p^) shl k);
  1774.         Inc(p);
  1775.         Inc(k, 8);
  1776.       end;
  1777.       Inc(c^.sub.copy.dist, uInt(b) and inflate_mask[j]);
  1778.       {DUMPBITS(j);}
  1779.       b := b shr j;
  1780.       Dec(k, j);
  1781.       {$IFDEF DEBUG}
  1782.       Tracevv('inflate:         distance '+ IntToStr(c^.sub.copy.dist));
  1783.       {$ENDIF}
  1784.       c^.mode := COPY;
  1785.       { falltrough }
  1786.     end;
  1787.   COPY:          { o: copying bytes in window, waiting for space }
  1788.     begin
  1789.       f := q;
  1790.       Dec(f, c^.sub.copy.dist);
  1791.       if (uInt(ptr2int(q) - ptr2int(s.window)) < c^.sub.copy.dist) then
  1792.       begin
  1793.         f := s.zend;
  1794.         Dec(f, c^.sub.copy.dist - uInt(ptr2int(q) - ptr2int(s.window)));
  1795.       end;
  1796.       while (c^.len <> 0) do
  1797.       begin
  1798.         {NEEDOUT}
  1799.         if (m = 0) then
  1800.         begin
  1801.           {WRAP}
  1802.           if (q = s.zend) and (s.read <> s.window) then
  1803.           begin
  1804.             q := s.window;
  1805.             if ptr2int(q) < ptr2int(s.read) then
  1806.               m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  1807.             else
  1808.               m := uInt(ptr2int(s.zend)-ptr2int(q));
  1809.           end;
  1810.           if (m = 0) then
  1811.           begin
  1812.             {FLUSH}
  1813.             s.write := q;
  1814.             r := inflate_flush(s,z,r);
  1815.             q := s.write;
  1816.             if ptr2int(q) < ptr2int(s.read) then
  1817.               m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  1818.             else
  1819.               m := uInt(ptr2int(s.zend)-ptr2int(q));
  1820.             {WRAP}
  1821.             if (q = s.zend) and (s.read <> s.window) then
  1822.             begin
  1823.               q := s.window;
  1824.               if ptr2int(q) < ptr2int(s.read) then
  1825.                 m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  1826.               else
  1827.                 m := uInt(ptr2int(s.zend)-ptr2int(q));
  1828.             end;
  1829.             if (m = 0) then
  1830.             begin
  1831.               {UPDATE}
  1832.               s.bitb := b;
  1833.               s.bitk := k;
  1834.               z.avail_in := n;
  1835.               Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1836.               z.next_in := p;
  1837.               s.write := q;
  1838.               inflate_codes := inflate_flush(s,z,r);
  1839.               exit;
  1840.             end;
  1841.           end;
  1842.         end;
  1843.         r := Z_OK;
  1844.         {OUTBYTE( *f++)}
  1845.         q^ := f^;
  1846.         Inc(q);
  1847.         Inc(f);
  1848.         Dec(m);
  1849.         if (f = s.zend) then
  1850.           f := s.window;
  1851.         Dec(c^.len);
  1852.       end;
  1853.       c^.mode := START;
  1854.       { C-switch break; not needed }
  1855.     end;
  1856.   LIT:           { o: got literal, waiting for output space }
  1857.     begin
  1858.       {NEEDOUT}
  1859.       if (m = 0) then
  1860.       begin
  1861.         {WRAP}
  1862.         if (q = s.zend) and (s.read <> s.window) then
  1863.         begin
  1864.           q := s.window;
  1865.           if ptr2int(q) < ptr2int(s.read) then
  1866.             m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  1867.           else
  1868.             m := uInt(ptr2int(s.zend)-ptr2int(q));
  1869.         end;
  1870.         if (m = 0) then
  1871.         begin
  1872.           {FLUSH}
  1873.           s.write := q;
  1874.           r := inflate_flush(s,z,r);
  1875.           q := s.write;
  1876.           if ptr2int(q) < ptr2int(s.read) then
  1877.             m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  1878.           else
  1879.             m := uInt(ptr2int(s.zend)-ptr2int(q));
  1880.           {WRAP}
  1881.           if (q = s.zend) and (s.read <> s.window) then
  1882.           begin
  1883.             q := s.window;
  1884.             if ptr2int(q) < ptr2int(s.read) then
  1885.               m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  1886.             else
  1887.               m := uInt(ptr2int(s.zend)-ptr2int(q));
  1888.           end;
  1889.           if (m = 0) then
  1890.           begin
  1891.             {UPDATE}
  1892.             s.bitb := b;
  1893.             s.bitk := k;
  1894.             z.avail_in := n;
  1895.             Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1896.             z.next_in := p;
  1897.             s.write := q;
  1898.             inflate_codes := inflate_flush(s,z,r);
  1899.             exit;
  1900.           end;
  1901.         end;
  1902.       end;
  1903.       r := Z_OK;
  1904.       {OUTBYTE(c^.sub.lit);}
  1905.       q^ := c^.sub.lit;
  1906.       Inc(q);
  1907.       Dec(m);
  1908.       c^.mode := START;
  1909.       {break;}
  1910.     end;
  1911.   WASH:          { o: got eob, possibly more output }
  1912.     begin
  1913.       {$ifdef patch112}
  1914.       if (k > 7) then           { return unused byte, if any }
  1915.       begin
  1916.         {$IFDEF DEBUG}
  1917.         Assert(k < 16, 'inflate_codes grabbed too many bytes');
  1918.         {$ENDIF}
  1919.         Dec(k, 8);
  1920.         Inc(n);
  1921.         Dec(p);                    { can always return one }
  1922.       end;
  1923.       {$endif}
  1924.       {FLUSH}
  1925.       s.write := q;
  1926.       r := inflate_flush(s,z,r);
  1927.       q := s.write;
  1928.       if ptr2int(q) < ptr2int(s.read) then
  1929.         m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  1930.       else
  1931.         m := uInt(ptr2int(s.zend)-ptr2int(q));
  1932.       if (s.read <> s.write) then
  1933.       begin
  1934.         {UPDATE}
  1935.         s.bitb := b;
  1936.         s.bitk := k;
  1937.         z.avail_in := n;
  1938.         Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1939.         z.next_in := p;
  1940.         s.write := q;
  1941.         inflate_codes := inflate_flush(s,z,r);
  1942.         exit;
  1943.       end;
  1944.       c^.mode := ZEND;
  1945.       { falltrough }
  1946.     end;
  1947.   ZEND:
  1948.     begin
  1949.       r := Z_STREAM_END;
  1950.       {UPDATE}
  1951.       s.bitb := b;
  1952.       s.bitk := k;
  1953.       z.avail_in := n;
  1954.       Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1955.       z.next_in := p;
  1956.       s.write := q;
  1957.       inflate_codes := inflate_flush(s,z,r);
  1958.       exit;
  1959.     end;
  1960.   BADCODE:       { x: got error }
  1961.     begin
  1962.       r := Z_DATA_ERROR;
  1963.       {UPDATE}
  1964.       s.bitb := b;
  1965.       s.bitk := k;
  1966.       z.avail_in := n;
  1967.       Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1968.       z.next_in := p;
  1969.       s.write := q;
  1970.       inflate_codes := inflate_flush(s,z,r);
  1971.       exit;
  1972.     end;
  1973.   else
  1974.     begin
  1975.       r := Z_STREAM_ERROR;
  1976.       {UPDATE}
  1977.       s.bitb := b;
  1978.       s.bitk := k;
  1979.       z.avail_in := n;
  1980.       Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  1981.       z.next_in := p;
  1982.       s.write := q;
  1983.       inflate_codes := inflate_flush(s,z,r);
  1984.       exit;
  1985.     end;
  1986.   end;
  1987. {NEED_DUMMY_RETURN - Delphi2+ dumb compilers complain without this }
  1988.   inflate_codes := Z_STREAM_ERROR;
  1989. end;
  1990. procedure inflate_codes_free(c : pInflate_codes_state;
  1991.                              var z : z_stream);
  1992. begin
  1993.   ZFREE(z, c);
  1994.   {$IFDEF DEBUG}  
  1995.   Tracev('inflate:       codes free');
  1996.   {$ENDIF}
  1997. end;
  1998. { Called with number of bytes left to write in window at least 258
  1999.   (the maximum string length) and number of input bytes available
  2000.   at least ten.  The ten bytes are six bytes for the longest length/
  2001.   distance pair plus four bytes for overloading the bit buffer. }
  2002. function inflate_fast( bl : uInt;
  2003.                        bd : uInt;
  2004.                        tl : pInflate_huft;
  2005.                        td : pInflate_huft;
  2006.                       var s : inflate_blocks_state;
  2007.                       var z : z_stream) : int;
  2008. var
  2009.   t : pInflate_huft;      { temporary pointer }
  2010.   e : uInt;               { extra bits or operation }
  2011.   b : uLong;              { bit buffer }
  2012.   k : uInt;               { bits in bit buffer }
  2013.   p : pBytef;             { input data pointer }
  2014.   n : uInt;               { bytes available there }
  2015.   q : pBytef;             { output window write pointer }
  2016.   m : uInt;               { bytes to end of window or read pointer }
  2017.   ml : uInt;              { mask for literal/length tree }
  2018.   md : uInt;              { mask for distance tree }
  2019.   c : uInt;               { bytes to copy }
  2020.   d : uInt;               { distance back to copy from }
  2021.   r : pBytef;             { copy source pointer }
  2022. begin
  2023.   { load input, output, bit values (macro LOAD) }
  2024.   p := z.next_in;
  2025.   n := z.avail_in;
  2026.   b := s.bitb;
  2027.   k := s.bitk;
  2028.   q := s.write;
  2029.   if ptr2int(q) < ptr2int(s.read) then
  2030.     m := uInt(ptr2int(s.read)-ptr2int(q)-1)
  2031.   else
  2032.     m := uInt(ptr2int(s.zend)-ptr2int(q));
  2033.   { initialize masks }
  2034.   ml := inflate_mask[bl];
  2035.   md := inflate_mask[bd];
  2036.   { do until not enough input or output space for fast loop }
  2037.   repeat                      { assume called with (m >= 258) and (n >= 10) }
  2038.     { get literal/length code }
  2039.     {GRABBITS(20);}             { max bits for literal/length code }
  2040.     while (k < 20) do
  2041.     begin
  2042.       Dec(n);
  2043.       b := b or (uLong(p^) shl k);
  2044.       Inc(p);
  2045.       Inc(k, 8);
  2046.     end;
  2047.     t := @(huft_ptr(tl)^[uInt(b) and ml]);
  2048.     e := t^.exop;
  2049.     if (e = 0) then
  2050.     begin
  2051.       {DUMPBITS(t^.bits);}
  2052.       b := b shr t^.bits;
  2053.       Dec(k, t^.bits);
  2054.      {$IFDEF DEBUG}
  2055.       if (t^.base >= $20) and (t^.base < $7f) then
  2056.         Tracevv('inflate:         * literal '+char(t^.base))
  2057.       else
  2058.         Tracevv('inflate:         * literal '+ IntToStr(t^.base));
  2059.       {$ENDIF}
  2060.       q^ := Byte(t^.base);
  2061.       Inc(q);
  2062.       Dec(m);
  2063.       continue;
  2064.     end;
  2065.     repeat
  2066.       {DUMPBITS(t^.bits);}
  2067.       b := b shr t^.bits;
  2068.       Dec(k, t^.bits);
  2069.       if (e and 16 <> 0) then
  2070.       begin
  2071.         { get extra bits for length }
  2072.         e := e and 15;
  2073.         c := t^.base + (uInt(b) and inflate_mask[e]);
  2074.         {DUMPBITS(e);}
  2075.         b := b shr e;
  2076.         Dec(k, e);
  2077.         {$IFDEF DEBUG}
  2078.         Tracevv('inflate:         * length ' + IntToStr(c));
  2079.         {$ENDIF}
  2080.         { decode distance base of block to copy }
  2081.         {GRABBITS(15);}           { max bits for distance code }
  2082.         while (k < 15) do
  2083.         begin
  2084.           Dec(n);
  2085.           b := b or (uLong(p^) shl k);
  2086.           Inc(p);
  2087.           Inc(k, 8);
  2088.         end;
  2089.         t := @huft_ptr(td)^[uInt(b) and md];
  2090.         e := t^.exop;
  2091.         repeat
  2092.           {DUMPBITS(t^.bits);}
  2093.           b := b shr t^.bits;
  2094.           Dec(k, t^.bits);
  2095.           if (e and 16 <> 0) then
  2096.           begin
  2097.             { get extra bits to add to distance base }
  2098.             e := e and 15;
  2099.             {GRABBITS(e);}         { get extra bits (up to 13) }
  2100.             while (k < e) do
  2101.             begin
  2102.               Dec(n);
  2103.               b := b or (uLong(p^) shl k);
  2104.               Inc(p);
  2105.               Inc(k, 8);
  2106.             end;
  2107.             d := t^.base + (uInt(b) and inflate_mask[e]);
  2108.             {DUMPBITS(e);}
  2109.             b := b shr e;
  2110.             Dec(k, e);
  2111.             {$IFDEF DEBUG}
  2112.             Tracevv('inflate:         * distance '+IntToStr(d));
  2113.             {$ENDIF}
  2114.             { do the copy }
  2115.             Dec(m, c);
  2116.             if (uInt(ptr2int(q) - ptr2int(s.window)) >= d) then     { offset before dest }
  2117.             begin                                  {  just copy }
  2118.               r := q;
  2119.               Dec(r, d);
  2120.               q^ := r^;  Inc(q); Inc(r); Dec(c); { minimum count is three, }
  2121.               q^ := r^;  Inc(q); Inc(r); Dec(c); { so unroll loop a little }
  2122.             end
  2123.             else                        { else offset after destination }
  2124.             begin
  2125.               e := d - uInt(ptr2int(q) - ptr2int(s.window)); { bytes from offset to end }
  2126.               r := s.zend;
  2127.               Dec(r, e);                  { pointer to offset }
  2128.               if (c > e) then             { if source crosses, }
  2129.               begin
  2130.                 Dec(c, e);                { copy to end of window }
  2131.                 repeat
  2132.                   q^ := r^;
  2133.                   Inc(q);
  2134.                   Inc(r);
  2135.                   Dec(e);
  2136.                 until (e=0);
  2137.                 r := s.window;           { copy rest from start of window }
  2138.               end;
  2139.             end;
  2140.             repeat                       { copy all or what's left }
  2141.               q^ := r^;
  2142.               Inc(q);
  2143.               Inc(r);
  2144.               Dec(c);
  2145.             until (c = 0);
  2146.             break;
  2147.           end
  2148.           else
  2149.             if (e and 64 = 0) then
  2150.             begin
  2151.               Inc(t, t^.base + (uInt(b) and inflate_mask[e]));
  2152.               e := t^.exop;
  2153.             end
  2154.           else
  2155.           begin
  2156.             z.msg := 'invalid distance code';
  2157.             {UNGRAB}
  2158.             c := z.avail_in-n;
  2159.             if (k shr 3) < c then
  2160.               c := k shr 3;
  2161.             Inc(n, c);
  2162.             Dec(p, c);
  2163.             Dec(k, c shl 3);
  2164.             {UPDATE}
  2165.             s.bitb := b;
  2166.             s.bitk := k;
  2167.             z.avail_in := n;
  2168.             Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  2169.             z.next_in := p;
  2170.             s.write := q;
  2171.             inflate_fast := Z_DATA_ERROR;
  2172.             exit;
  2173.           end;
  2174.         until FALSE;
  2175.         break;
  2176.       end;
  2177.       if (e and 64 = 0) then
  2178.       begin
  2179.          {t += t->base;
  2180.           e = (t += ((uInt)b & inflate_mask[e]))->exop;}
  2181.         Inc(t, t^.base + (uInt(b) and inflate_mask[e]));
  2182.         e := t^.exop;
  2183.         if (e = 0) then
  2184.         begin
  2185.           {DUMPBITS(t^.bits);}
  2186.           b := b shr t^.bits;
  2187.           Dec(k, t^.bits);
  2188.          {$IFDEF DEBUG}
  2189.           if (t^.base >= $20) and (t^.base < $7f) then
  2190.             Tracevv('inflate:         * literal '+char(t^.base))
  2191.           else
  2192.             Tracevv('inflate:         * literal '+IntToStr(t^.base));
  2193.           {$ENDIF}            
  2194.           q^ := Byte(t^.base);
  2195.           Inc(q);
  2196.           Dec(m);
  2197.           break;
  2198.         end;
  2199.       end
  2200.       else
  2201.         if (e and 32 <> 0) then
  2202.         begin
  2203.           {$IFDEF DEBUG}
  2204.           Tracevv('inflate:         * end of block');
  2205.           {$ENDIF}
  2206.           {UNGRAB}
  2207.           c := z.avail_in-n;
  2208.           if (k shr 3) < c then
  2209.             c := k shr 3;
  2210.           Inc(n, c);
  2211.           Dec(p, c);
  2212.           Dec(k, c shl 3);
  2213.           {UPDATE}
  2214.           s.bitb := b;
  2215.           s.bitk := k;
  2216.           z.avail_in := n;
  2217.           Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  2218.           z.next_in := p;
  2219.           s.write := q;
  2220.           inflate_fast := Z_STREAM_END;
  2221.           exit;
  2222.         end
  2223.         else
  2224.         begin
  2225.           z.msg := 'invalid literal/length code';
  2226.           {UNGRAB}
  2227.           c := z.avail_in-n;
  2228.           if (k shr 3) < c then
  2229.             c := k shr 3;
  2230.           Inc(n, c);
  2231.           Dec(p, c);
  2232.           Dec(k, c shl 3);
  2233.           {UPDATE}
  2234.           s.bitb := b;
  2235.           s.bitk := k;
  2236.           z.avail_in := n;
  2237.           Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  2238.           z.next_in := p;
  2239.           s.write := q;
  2240.           inflate_fast := Z_DATA_ERROR;
  2241.           exit;
  2242.         end;
  2243.     until FALSE;
  2244.   until (m < 258) or (n < 10);
  2245.   { not enough input or output--restore pointers and return }
  2246.   {UNGRAB}
  2247.   c := z.avail_in-n;
  2248.   if (k shr 3) < c then
  2249.     c := k shr 3;
  2250.   Inc(n, c);
  2251.   Dec(p, c);
  2252.   Dec(k, c shl 3);
  2253.   {UPDATE}
  2254.   s.bitb := b;
  2255.   s.bitk := k;
  2256.   z.avail_in := n;
  2257.   Inc(z.total_in, ptr2int(p)-ptr2int(z.next_in));
  2258.   z.next_in := p;
  2259.   s.write := q;
  2260.   inflate_fast := Z_OK;
  2261. end;
  2262. function inflateReset(var z : z_stream) : int;
  2263. begin
  2264.   if (z.state = Z_NULL) then
  2265.   begin
  2266.     inflateReset :=  Z_STREAM_ERROR;
  2267.     exit;
  2268.   end;
  2269.   z.total_out := 0;
  2270.   z.total_in := 0;
  2271.   z.msg := '';
  2272.   if z.state^.nowrap then
  2273.     z.state^.mode := BLOCKS
  2274.   else
  2275.     z.state^.mode := METHOD;
  2276.   inflate_blocks_reset(z.state^.blocks^, z, Z_NULL);
  2277.   {$IFDEF DEBUG}
  2278.   Tracev('inflate: reset');
  2279.   {$ENDIF}
  2280.   inflateReset :=  Z_OK;
  2281. end;
  2282. function inflateEnd(var z : z_stream) : int;
  2283. begin
  2284.   if (z.state = Z_NULL) or not Assigned(z.zfree) then
  2285.   begin
  2286.     inflateEnd :=  Z_STREAM_ERROR;
  2287.     exit;
  2288.   end;
  2289.   if (z.state^.blocks <> Z_NULL) then
  2290.     inflate_blocks_free(z.state^.blocks, z);
  2291.   ZFREE(z, z.state);
  2292.   z.state := Z_NULL;
  2293.   {$IFDEF DEBUG}
  2294.   Tracev('inflate: end');
  2295.   {$ENDIF}
  2296.   inflateEnd :=  Z_OK;
  2297. end;
  2298. function inflateInit2_(var z: z_stream;
  2299.                        w : int;
  2300.                        const version : string;
  2301.                        stream_size : int) : int;
  2302. begin
  2303.   if (version = '') or (version[1] <> ZLIB_VERSION[1]) or
  2304.       (stream_size <> sizeof(z_stream)) then
  2305.   begin
  2306.     inflateInit2_ := Z_VERSION_ERROR;
  2307.     exit;
  2308.   end;
  2309.   { initialize state }
  2310.   { SetLength(strm.msg, 255); }
  2311.   z.msg := '';
  2312.   if not Assigned(z.zalloc) then
  2313.   begin
  2314.     z.zalloc := zcalloc;
  2315.     z.opaque := voidpf(0);
  2316.   end;
  2317.   if not Assigned(z.zfree) then
  2318.     z.zfree := zcfree;
  2319.   z.state := pInternal_state( ZALLOC(z,1,sizeof(internal_state)) );
  2320.   if (z.state = Z_NULL) then
  2321.   begin
  2322.     inflateInit2_ := Z_MEM_ERROR;
  2323.     exit;
  2324.   end;
  2325.   z.state^.blocks := Z_NULL;
  2326.   { handle undocumented nowrap option (no zlib header or check) }
  2327.   z.state^.nowrap := FALSE;
  2328.   if (w < 0) then
  2329.   begin
  2330.     w := - w;
  2331.     z.state^.nowrap := TRUE;
  2332.   end;
  2333.   { set window size }
  2334.   if (w < 8) or (w > 15) then
  2335.   begin
  2336.     inflateEnd(z);
  2337.     inflateInit2_ := Z_STREAM_ERROR;
  2338.     exit;
  2339.   end;
  2340.   z.state^.wbits := uInt(w);
  2341.   { create inflate_blocks state }
  2342.   if z.state^.nowrap then
  2343.     z.state^.blocks := inflate_blocks_new(z, NIL, uInt(1) shl w)
  2344.   else
  2345.     z.state^.blocks := inflate_blocks_new(z, adler32, uInt(1) shl w);
  2346.   if (z.state^.blocks = Z_NULL) then
  2347.   begin
  2348.     inflateEnd(z);
  2349.     inflateInit2_ := Z_MEM_ERROR;
  2350.     exit;
  2351.   end;
  2352.   {$IFDEF DEBUG}
  2353.   Tracev('inflate: allocated');
  2354.   {$ENDIF}
  2355.   { reset state }
  2356.   inflateReset(z);
  2357.   inflateInit2_ :=  Z_OK;
  2358. end;
  2359. function inflateInit(var z : z_stream) : int;
  2360. { inflateInit is a macro to allow checking the zlib version
  2361.   and the compiler's view of z_stream:
  2362.   }
  2363. begin
  2364.   inflateInit := inflateInit2_(z, DEF_WBITS, ZLIB_VERSION, sizeof(z_stream));
  2365. end;
  2366. function inflateInit_(z : z_streamp;
  2367.                       const version : string;
  2368.                       stream_size : int) : int;
  2369. begin
  2370.   { initialize state }
  2371.   if (z = Z_NULL) then
  2372.     inflateInit_ := Z_STREAM_ERROR
  2373.   else
  2374.     inflateInit_ := inflateInit2_(z^, DEF_WBITS, version, stream_size);
  2375. end;
  2376. function inflate(var z : z_stream;
  2377.                  f : int) : int;
  2378. var
  2379.   r : int;
  2380.   b : uInt;
  2381. begin
  2382.   if (z.state = Z_NULL) or (z.next_in = Z_NULL) then
  2383.   begin
  2384.     inflate := Z_STREAM_ERROR;
  2385.     exit;
  2386.   end;
  2387.   if f = Z_FINISH then
  2388.     f := Z_BUF_ERROR
  2389.   else
  2390.     f := Z_OK;
  2391.   r := Z_BUF_ERROR;
  2392.   while True do
  2393.   case (z.state^.mode) of
  2394.     BLOCKS:
  2395.       begin
  2396.         r := inflate_blocks(z.state^.blocks^, z, r);
  2397.         if (r = Z_DATA_ERROR) then
  2398.         begin
  2399.           z.state^.mode := BAD;
  2400.           z.state^.sub.marker := 0;       { can try inflateSync }
  2401.           continue;            { break C-switch }
  2402.         end;
  2403.         if (r = Z_OK) then
  2404.           r := f;
  2405.         if (r <> Z_STREAM_END) then
  2406.         begin
  2407.           inflate := r;
  2408.           exit;
  2409.         end;
  2410.         r := f;
  2411.         inflate_blocks_reset(z.state^.blocks^, z, @z.state^.sub.check.was);
  2412.         if (z.state^.nowrap) then
  2413.         begin
  2414.           z.state^.mode := DONE;
  2415.           continue;            { break C-switch }
  2416.         end;
  2417.         z.state^.mode := CHECK4;  { falltrough }
  2418.       end;
  2419.     CHECK4:
  2420.       begin
  2421.         {NEEDBYTE}
  2422.         if (z.avail_in = 0) then
  2423.         begin
  2424.           inflate := r;
  2425.           exit;
  2426.         end;
  2427.         r := f;
  2428.         {z.state^.sub.check.need := uLong(NEXTBYTE(z)) shl 24;}
  2429.         Dec(z.avail_in);
  2430.         Inc(z.total_in);
  2431.         z.state^.sub.check.need := uLong(z.next_in^) shl 24;
  2432.         Inc(z.next_in);
  2433.         z.state^.mode := CHECK3;   { falltrough }
  2434.       end;
  2435.     CHECK3:
  2436.       begin
  2437.         {NEEDBYTE}
  2438.         if (z.avail_in = 0) then
  2439.         begin
  2440.           inflate := r;
  2441.           exit;
  2442.         end;
  2443.         r := f;
  2444.         {Inc( z.state^.sub.check.need, uLong(NEXTBYTE(z)) shl 16);}
  2445.         Dec(z.avail_in);
  2446.         Inc(z.total_in);
  2447.         Inc(z.state^.sub.check.need, uLong(z.next_in^) shl 16);
  2448.         Inc(z.next_in);
  2449.         z.state^.mode := CHECK2;   { falltrough }
  2450.       end;
  2451.     CHECK2:
  2452.       begin
  2453.         {NEEDBYTE}
  2454.         if (z.avail_in = 0) then
  2455.         begin
  2456.           inflate := r;
  2457.           exit;
  2458.         end;
  2459.         r := f;
  2460.         {Inc( z.state^.sub.check.need, uLong(NEXTBYTE(z)) shl 8);}
  2461.         Dec(z.avail_in);
  2462.         Inc(z.total_in);
  2463.         Inc(z.state^.sub.check.need, uLong(z.next_in^) shl 8);
  2464.         Inc(z.next_in);
  2465.         z.state^.mode := CHECK1;   { falltrough }
  2466.       end;
  2467.     CHECK1:
  2468.       begin
  2469.         {NEEDBYTE}
  2470.         if (z.avail_in = 0) then
  2471.         begin
  2472.           inflate := r;
  2473.           exit;
  2474.         end;
  2475.         r := f;
  2476.         {Inc( z.state^.sub.check.need, uLong(NEXTBYTE(z)) );}
  2477.         Dec(z.avail_in);
  2478.         Inc(z.total_in);
  2479.         Inc(z.state^.sub.check.need, uLong(z.next_in^) );
  2480.         Inc(z.next_in);
  2481.         if (z.state^.sub.check.was <> z.state^.sub.check.need) then
  2482.         begin
  2483.           z.state^.mode := BAD;
  2484.           z.msg := 'incorrect data check';
  2485.           z.state^.sub.marker := 5;       { can't try inflateSync }
  2486.           continue;           { break C-switch }
  2487.         end;
  2488.         {$IFDEF DEBUG}
  2489.         Tracev('inflate: zlib check ok');
  2490.         {$ENDIF}
  2491.         z.state^.mode := DONE; { falltrough }
  2492.       end;
  2493.     DONE:
  2494.       begin
  2495.         inflate := Z_STREAM_END;
  2496.         exit;
  2497.       end;
  2498.     METHOD:
  2499.       begin
  2500.         {NEEDBYTE}
  2501.         if (z.avail_in = 0) then
  2502.         begin
  2503.           inflate := r;
  2504.           exit;
  2505.         end;
  2506.         r := f; {}
  2507.         {z.state^.sub.method := NEXTBYTE(z);}
  2508.         Dec(z.avail_in);
  2509.         Inc(z.total_in);
  2510.         z.state^.sub.method := z.next_in^;
  2511.         Inc(z.next_in);
  2512.         if ((z.state^.sub.method and $0f) <> Z_DEFLATED) then
  2513.         begin
  2514.           z.state^.mode := BAD;
  2515.           z.msg := 'unknown compression method';
  2516.           z.state^.sub.marker := 5;       { can't try inflateSync }
  2517.           continue;  { break C-switch }
  2518.         end;
  2519.         if ((z.state^.sub.method shr 4) + 8 > z.state^.wbits) then
  2520.         begin
  2521.           z.state^.mode := BAD;
  2522.           z.msg := 'invalid window size';
  2523.           z.state^.sub.marker := 5;       { can't try inflateSync }
  2524.           continue; { break C-switch }
  2525.         end;
  2526.         z.state^.mode := FLAG;
  2527.         { fall trough }
  2528.       end;
  2529.     FLAG:
  2530.       begin
  2531.         {NEEDBYTE}
  2532.         if (z.avail_in = 0) then
  2533.         begin
  2534.           inflate := r;
  2535.           exit;
  2536.         end;
  2537.         r := f; {}
  2538.         {b := NEXTBYTE(z);}
  2539.         Dec(z.avail_in);
  2540.         Inc(z.total_in);
  2541.         b := z.next_in^;
  2542.         Inc(z.next_in);
  2543.         if (((z.state^.sub.method shl 8) + b) mod 31) <> 0 then {% mod ?}
  2544.         begin
  2545.           z.state^.mode := BAD;
  2546.           z.msg := 'incorrect header check';
  2547.           z.state^.sub.marker := 5;       { can't try inflateSync }
  2548.           continue;      { break C-switch }
  2549.         end;
  2550.         {$IFDEF DEBUG}
  2551.         Tracev('inflate: zlib header ok');
  2552.         {$ENDIF}
  2553.         if ((b and PRESET_DICT) = 0) then
  2554.         begin
  2555.           z.state^.mode := BLOCKS;
  2556.   continue;      { break C-switch }
  2557.         end;
  2558.         z.state^.mode := DICT4;
  2559.         { falltrough }
  2560.       end;
  2561.     DICT4:
  2562.       begin
  2563.         if (z.avail_in = 0) then
  2564.         begin
  2565.           inflate := r;
  2566.           exit;
  2567.         end;
  2568.         r := f;
  2569.         {z.state^.sub.check.need := uLong(NEXTBYTE(z)) shl 24;}
  2570.         Dec(z.avail_in);
  2571.         Inc(z.total_in);
  2572.         z.state^.sub.check.need :=  uLong(z.next_in^) shl 24;
  2573.         Inc(z.next_in);
  2574.         z.state^.mode := DICT3;        { falltrough }
  2575.       end;
  2576.     DICT3:
  2577.       begin
  2578.         if (z.avail_in = 0) then
  2579.         begin
  2580.           inflate := r;
  2581.           exit;
  2582.         end;
  2583.         r := f;
  2584.         {Inc(z.state^.sub.check.need, uLong(NEXTBYTE(z)) shl 16);}
  2585.         Dec(z.avail_in);
  2586.         Inc(z.total_in);
  2587.         Inc(z.state^.sub.check.need, uLong(z.next_in^) shl 16);
  2588.         Inc(z.next_in);
  2589.         z.state^.mode := DICT2;        { falltrough }
  2590.       end;
  2591.     DICT2:
  2592.       begin
  2593.         if (z.avail_in = 0) then
  2594.         begin
  2595.           inflate := r;
  2596.           exit;
  2597.         end;
  2598.         r := f;
  2599.         {Inc(z.state^.sub.check.need, uLong(NEXTBYTE(z)) shl 8);}
  2600.         Dec(z.avail_in);
  2601.         Inc(z.total_in);
  2602.         Inc(z.state^.sub.check.need, uLong(z.next_in^) shl 8);
  2603.         Inc(z.next_in);
  2604.         z.state^.mode := DICT1;        { falltrough }
  2605.       end;
  2606.     DICT1:
  2607.       begin
  2608.         if (z.avail_in = 0) then
  2609.         begin
  2610.           inflate := r;
  2611.           exit;
  2612.         end;
  2613.         { r := f;    ---  wird niemals benutzt }
  2614.         {Inc(z.state^.sub.check.need, uLong(NEXTBYTE(z)) );}
  2615.         Dec(z.avail_in);
  2616.         Inc(z.total_in);
  2617.         Inc(z.state^.sub.check.need, uLong(z.next_in^) );
  2618.         Inc(z.next_in);
  2619.         z.adler := z.state^.sub.check.need;
  2620.         z.state^.mode := DICT0;
  2621.         inflate := Z_NEED_DICT;
  2622.         exit;
  2623.       end;
  2624.     DICT0:
  2625.       begin
  2626.         z.state^.mode := BAD;
  2627.         z.msg := 'need dictionary';
  2628.         z.state^.sub.marker := 0;         { can try inflateSync }
  2629.         inflate := Z_STREAM_ERROR;
  2630.         exit;
  2631.       end;
  2632.     BAD:
  2633.       begin
  2634.         inflate := Z_DATA_ERROR;
  2635.         exit;
  2636.       end;
  2637.     else
  2638.       begin
  2639.         inflate := Z_STREAM_ERROR;
  2640.         exit;
  2641.       end;
  2642.   end;
  2643. {$ifdef NEED_DUMMY_result}