Unit iminfutil; { types and macros common to blocks and codes Copyright (C) 1995-1998 Mark Adler WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Pascal tranlastion Copyright (C) 1998 by Jacques Nomssi Nzali For conditions of distribution and use, see copyright notice in readme.txt } interface {$I imzconf.inc} uses imzutil, impaszlib; { copy as much as possible from the sliding window to the output area } function inflate_flush(var s : inflate_blocks_state; var z : z_stream; r : int) : int; { And'ing with mask[n] masks the lower n bits } const inflate_mask : array[0..17-1] of uInt = ( $0000, $0001, $0003, $0007, $000f, $001f, $003f, $007f, $00ff, $01ff, $03ff, $07ff, $0fff, $1fff, $3fff, $7fff, $ffff); {procedure GRABBITS(j : int);} {procedure DUMPBITS(j : int);} {procedure NEEDBITS(j : int);} implementation { macros for bit input with no checking and for returning unused bytes } procedure GRABBITS(j : int); begin {while (k < j) do begin Dec(z^.avail_in); Inc(z^.total_in); b := b or (uLong(z^.next_in^) shl k); Inc(z^.next_in); Inc(k, 8); end;} end; procedure DUMPBITS(j : int); begin {b := b shr j; Dec(k, j);} end; procedure NEEDBITS(j : int); begin (* while (k < j) do begin {NEEDBYTE;} if (n <> 0) then r :=Z_OK else begin {UPDATE} s.bitb := b; s.bitk := k; z.avail_in := n; Inc(z.total_in, LongInt(p)-LongInt(z.next_in)); z.next_in := p; s.write := q; result := inflate_flush(s,z,r); exit; end; Dec(n); b := b or (uLong(p^) shl k); Inc(p); Inc(k, 8); end; *) end; procedure NEEDOUT; begin (* if (m = 0) then begin {WRAP} if (q = s.zend) and (s.read <> s.window) then begin q := s.window; if LongInt(q) < LongInt(s.read) then m := uInt(LongInt(s.read)-LongInt(q)-1) else m := uInt(LongInt(s.zend)-LongInt(q)); end; if (m = 0) then begin {FLUSH} s.write := q; r := inflate_flush(s,z,r); q := s.write; if LongInt(q) < LongInt(s.read) then m := uInt(LongInt(s.read)-LongInt(q)-1) else m := uInt(LongInt(s.zend)-LongInt(q)); {WRAP} if (q = s.zend) and (s.read <> s.window) then begin q := s.window; if LongInt(q) < LongInt(s.read) then m := uInt(LongInt(s.read)-LongInt(q)-1) else m := uInt(LongInt(s.zend)-LongInt(q)); end; if (m = 0) then begin {UPDATE} s.bitb := b; s.bitk := k; z.avail_in := n; Inc(z.total_in, LongInt(p)-LongInt(z.next_in)); z.next_in := p; s.write := q; result := inflate_flush(s,z,r); exit; end; end; end; r := Z_OK; *) end; { copy as much as possible from the sliding window to the output area } function inflate_flush(var s : inflate_blocks_state; var z : z_stream; r : int) : int; var n : uInt; p : pBytef; q : pBytef; begin { local copies of source and destination pointers } p := z.next_out; q := s.read; { compute number of bytes to copy as far as end of window } if ptr2int(q) <= ptr2int(s.write) then n := uInt(ptr2int(s.write) - ptr2int(q)) else n := uInt(ptr2int(s.zend) - ptr2int(q)); if (n > z.avail_out) then n := z.avail_out; if (n <> 0) and (r = Z_BUF_ERROR) then r := Z_OK; { update counters } Dec(z.avail_out, n); Inc(z.total_out, n); { update check information } if Assigned(s.checkfn) then begin s.check := s.checkfn(s.check, q, n); z.adler := s.check; end; { copy as far as end of window } zmemcpy(p, q, n); Inc(p, n); Inc(q, n); { see if more to copy at beginning of window } if (q = s.zend) then begin { wrap pointers } q := s.window; if (s.write = s.zend) then s.write := s.window; { compute bytes to copy } n := uInt(ptr2int(s.write) - ptr2int(q)); if (n > z.avail_out) then n := z.avail_out; if (n <> 0) and (r = Z_BUF_ERROR) then r := Z_OK; { update counters } Dec( z.avail_out, n); Inc( z.total_out, n); { update check information } if Assigned(s.checkfn) then begin s.check := s.checkfn(s.check, q, n); z.adler := s.check; end; { copy } zmemcpy(p, q, n); Inc(p, n); Inc(q, n); end; { update pointers } z.next_out := p; s.read := q; { done } inflate_flush := r; end; end.