|
@@ -1,7 +1,5 @@
|
|
unit infblock;
|
|
unit infblock;
|
|
|
|
|
|
-{$goto on}
|
|
|
|
-
|
|
|
|
{ infblock.h and
|
|
{ infblock.h and
|
|
infblock.c -- interpret and process block types to last block
|
|
infblock.c -- interpret and process block types to last block
|
|
Copyright (C) 1995-1998 Mark Adler
|
|
Copyright (C) 1995-1998 Mark Adler
|
|
@@ -172,10 +170,6 @@ end;
|
|
function inflate_blocks (var s : inflate_blocks_state;
|
|
function inflate_blocks (var s : inflate_blocks_state;
|
|
var z : z_stream;
|
|
var z : z_stream;
|
|
r : integer) : integer; { initial return code }
|
|
r : integer) : integer; { initial return code }
|
|
-label
|
|
|
|
- start_btree, start_dtree,
|
|
|
|
- start_blkdone, start_dry,
|
|
|
|
- start_codes;
|
|
|
|
|
|
|
|
var
|
|
var
|
|
t : cardinal; { temporary storage }
|
|
t : cardinal; { temporary storage }
|
|
@@ -194,6 +188,350 @@ var
|
|
i, j, c : cardinal;
|
|
i, j, c : cardinal;
|
|
var
|
|
var
|
|
cs : pInflate_codes_state;
|
|
cs : pInflate_codes_state;
|
|
|
|
+
|
|
|
|
+ procedure do_btree;
|
|
|
|
+
|
|
|
|
+ begin
|
|
|
|
+ while (s.sub.trees.index < 4 + (s.sub.trees.table shr 10)) do
|
|
|
|
+ begin
|
|
|
|
+ {NEEDBITS(3);}
|
|
|
|
+ while (k < 3) 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, ptruint(p)-ptruint(z.next_in));
|
|
|
|
+ z.next_in := p;
|
|
|
|
+ s.write := q;
|
|
|
|
+ inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
|
|
+ dec(n);
|
|
|
|
+ b := b or (cardinal(p^) shl k);
|
|
|
|
+ Inc(p);
|
|
|
|
+ Inc(k, 8);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ s.sub.trees.blens^[border[s.sub.trees.index]] := cardinal(b) and 7;
|
|
|
|
+ Inc(s.sub.trees.index);
|
|
|
|
+ {DUMPBITS(3);}
|
|
|
|
+ b := b shr 3;
|
|
|
|
+ dec(k, 3);
|
|
|
|
+ end;
|
|
|
|
+ while (s.sub.trees.index < 19) do
|
|
|
|
+ begin
|
|
|
|
+ s.sub.trees.blens^[border[s.sub.trees.index]] := 0;
|
|
|
|
+ Inc(s.sub.trees.index);
|
|
|
|
+ end;
|
|
|
|
+ s.sub.trees.bb := 7;
|
|
|
|
+ t := inflate_trees_bits(s.sub.trees.blens^, s.sub.trees.bb,
|
|
|
|
+ s.sub.trees.tb, s.hufts^, z);
|
|
|
|
+ if (t <> Z_OK) then
|
|
|
|
+ begin
|
|
|
|
+ freemem(s.sub.trees.blens);
|
|
|
|
+ s.sub.trees.blens := nil;
|
|
|
|
+ r := t;
|
|
|
|
+ if (r = Z_DATA_ERROR) then
|
|
|
|
+ s.mode := BLKBAD;
|
|
|
|
+ { update pointers and return }
|
|
|
|
+ s.bitb := b;
|
|
|
|
+ s.bitk := k;
|
|
|
|
+ z.avail_in := n;
|
|
|
|
+ Inc(z.total_in, ptruint(p) - ptruint(z.next_in));
|
|
|
|
+ z.next_in := p;
|
|
|
|
+ s.write := q;
|
|
|
|
+ inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
|
|
+ s.sub.trees.index := 0;
|
|
|
|
+ {$IFDEF ZLIB_DEBUG}
|
|
|
|
+ Tracev('inflate: bits tree ok');
|
|
|
|
+ {$ENDIF}
|
|
|
|
+ s.mode := DTREE;
|
|
|
|
+ { fall through again }
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ procedure do_dtree;
|
|
|
|
+
|
|
|
|
+ begin
|
|
|
|
+ while TRUE do
|
|
|
|
+ begin
|
|
|
|
+ t := s.sub.trees.table;
|
|
|
|
+ if not (s.sub.trees.index < 258 +
|
|
|
|
+ (t and $1f) + ((t shr 5) and $1f)) then
|
|
|
|
+ break;
|
|
|
|
+ t := s.sub.trees.bb;
|
|
|
|
+ {NEEDBITS(t);}
|
|
|
|
+ while (k < t) 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, ptruint(p)-ptruint(z.next_in));
|
|
|
|
+ z.next_in := p;
|
|
|
|
+ s.write := q;
|
|
|
|
+ inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
|
|
+ dec(n);
|
|
|
|
+ b := b or (cardinal(p^) shl k);
|
|
|
|
+ Inc(p);
|
|
|
|
+ Inc(k, 8);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ h := s.sub.trees.tb;
|
|
|
|
+ Inc(h, cardinal(b) and inflate_mask[t]);
|
|
|
|
+ t := h^.Bits;
|
|
|
|
+ c := h^.Base;
|
|
|
|
+
|
|
|
|
+ if (c < 16) then
|
|
|
|
+ begin
|
|
|
|
+ {DUMPBITS(t);}
|
|
|
|
+ b := b shr t;
|
|
|
|
+ dec(k, t);
|
|
|
|
+
|
|
|
|
+ s.sub.trees.blens^[s.sub.trees.index] := c;
|
|
|
|
+ Inc(s.sub.trees.index);
|
|
|
|
+ end
|
|
|
|
+ else { c = 16..18 }
|
|
|
|
+ begin
|
|
|
|
+ if c = 18 then
|
|
|
|
+ begin
|
|
|
|
+ i := 7;
|
|
|
|
+ j := 11;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ begin
|
|
|
|
+ i := c - 14;
|
|
|
|
+ j := 3;
|
|
|
|
+ end;
|
|
|
|
+ {NEEDBITS(t + i);}
|
|
|
|
+ while (k < t + i) 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, ptruint(p)-ptruint(z.next_in));
|
|
|
|
+ z.next_in := p;
|
|
|
|
+ s.write := q;
|
|
|
|
+ inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
|
|
+ dec(n);
|
|
|
|
+ b := b or (cardinal(p^) shl k);
|
|
|
|
+ Inc(p);
|
|
|
|
+ Inc(k, 8);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ {DUMPBITS(t);}
|
|
|
|
+ b := b shr t;
|
|
|
|
+ dec(k, t);
|
|
|
|
+
|
|
|
|
+ Inc(j, cardinal(b) and inflate_mask[i]);
|
|
|
|
+ {DUMPBITS(i);}
|
|
|
|
+ b := b shr i;
|
|
|
|
+ dec(k, i);
|
|
|
|
+
|
|
|
|
+ i := s.sub.trees.index;
|
|
|
|
+ t := s.sub.trees.table;
|
|
|
|
+ if (i + j > 258 + (t and $1f) + ((t shr 5) and $1f)) or
|
|
|
|
+ ((c = 16) and (i < 1)) then
|
|
|
|
+ begin
|
|
|
|
+ freemem(s.sub.trees.blens);
|
|
|
|
+ s.sub.trees.blens := nil;
|
|
|
|
+ s.mode := BLKBAD;
|
|
|
|
+ z.msg := 'invalid bit length repeat';
|
|
|
|
+ r := Z_DATA_ERROR;
|
|
|
|
+ { update pointers and return }
|
|
|
|
+ s.bitb := b;
|
|
|
|
+ s.bitk := k;
|
|
|
|
+ z.avail_in := n;
|
|
|
|
+ Inc(z.total_in, ptruint(p) - ptruint(z.next_in));
|
|
|
|
+ z.next_in := p;
|
|
|
|
+ s.write := q;
|
|
|
|
+ inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
|
|
+ if c = 16 then
|
|
|
|
+ c := s.sub.trees.blens^[i - 1]
|
|
|
|
+ else
|
|
|
|
+ c := 0;
|
|
|
|
+ repeat
|
|
|
|
+ s.sub.trees.blens^[i] := c;
|
|
|
|
+ Inc(i);
|
|
|
|
+ dec(j);
|
|
|
|
+ until (j=0);
|
|
|
|
+ s.sub.trees.index := i;
|
|
|
|
+ end;
|
|
|
|
+ end; { while }
|
|
|
|
+ s.sub.trees.tb := nil;
|
|
|
|
+ begin
|
|
|
|
+ bl := 9; { must be <= 9 for lookahead assumptions }
|
|
|
|
+ bd := 6; { must be <= 9 for lookahead assumptions }
|
|
|
|
+ t := s.sub.trees.table;
|
|
|
|
+ t := inflate_trees_dynamic(257 + (t and $1f),
|
|
|
|
+ 1 + ((t shr 5) and $1f),
|
|
|
|
+ s.sub.trees.blens^, bl, bd, tl, td, s.hufts^, z);
|
|
|
|
+ freemem(s.sub.trees.blens);
|
|
|
|
+ s.sub.trees.blens := nil;
|
|
|
|
+ if (t <> Z_OK) then
|
|
|
|
+ begin
|
|
|
|
+ if (t = cardinal(Z_DATA_ERROR)) then
|
|
|
|
+ s.mode := BLKBAD;
|
|
|
|
+ r := t;
|
|
|
|
+ { update pointers and return }
|
|
|
|
+ s.bitb := b;
|
|
|
|
+ s.bitk := k;
|
|
|
|
+ z.avail_in := n;
|
|
|
|
+ Inc(z.total_in, ptruint(p) - ptruint(z.next_in));
|
|
|
|
+ z.next_in := p;
|
|
|
|
+ s.write := q;
|
|
|
|
+ inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
|
|
+ {$IFDEF ZLIB_DEBUG}
|
|
|
|
+ Tracev('inflate: trees ok');
|
|
|
|
+ {$ENDIF}
|
|
|
|
+ { c renamed to cs }
|
|
|
|
+ cs := inflate_codes_new(bl, bd, tl, td, z);
|
|
|
|
+ if (cs = nil) then
|
|
|
|
+ begin
|
|
|
|
+ r := Z_MEM_ERROR;
|
|
|
|
+ { update pointers and return }
|
|
|
|
+ s.bitb := b;
|
|
|
|
+ s.bitk := k;
|
|
|
|
+ z.avail_in := n;
|
|
|
|
+ Inc(z.total_in, ptruint(p) - ptruint(z.next_in));
|
|
|
|
+ z.next_in := p;
|
|
|
|
+ s.write := q;
|
|
|
|
+ inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
|
|
+ s.sub.decode.codes := cs;
|
|
|
|
+ end;
|
|
|
|
+ s.mode := CODES;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ function do_codes: boolean;
|
|
|
|
+
|
|
|
|
+ begin
|
|
|
|
+ { update pointers }
|
|
|
|
+ s.bitb := b;
|
|
|
|
+ s.bitk := k;
|
|
|
|
+ z.avail_in := n;
|
|
|
|
+ Inc(z.total_in, ptruint(p) - ptruint(z.next_in));
|
|
|
|
+ z.next_in := p;
|
|
|
|
+ s.write := q;
|
|
|
|
+
|
|
|
|
+ r := inflate_codes(s, z, r);
|
|
|
|
+ if (r <> Z_STREAM_END) then
|
|
|
|
+ begin
|
|
|
|
+ inflate_blocks := inflate_flush(s, z, r);
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
|
|
+ r := Z_OK;
|
|
|
|
+ inflate_codes_free(s.sub.decode.codes, z);
|
|
|
|
+ { load local pointers }
|
|
|
|
+ p := z.next_in;
|
|
|
|
+ n := z.avail_in;
|
|
|
|
+ b := s.bitb;
|
|
|
|
+ k := s.bitk;
|
|
|
|
+ q := s.write;
|
|
|
|
+ if ptruint(q) < ptruint(s.read) then
|
|
|
|
+ m := cardinal(ptruint(s.read)-ptruint(q)-1)
|
|
|
|
+ else
|
|
|
|
+ m := cardinal(ptruint(s.zend)-ptruint(q));
|
|
|
|
+ {$IFDEF ZLIB_DEBUG}
|
|
|
|
+ if (ptruint(q) >= ptruint(s.read)) then
|
|
|
|
+ Tracev('inflate: codes end '+
|
|
|
|
+ IntToStr(z.total_out + ptruint(q) - ptruint(s.read)) + ' total out')
|
|
|
|
+ else
|
|
|
|
+ Tracev('inflate: codes end '+
|
|
|
|
+ IntToStr(z.total_out + ptruint(s.zend) - ptruint(s.read) +
|
|
|
|
+ ptruint(q) - ptruint(s.window)) + ' total out');
|
|
|
|
+ {$ENDIF}
|
|
|
|
+ if (not s.last) then
|
|
|
|
+ begin
|
|
|
|
+ s.mode := ZTYPE;
|
|
|
|
+ exit(false); { break for switch statement in C-code }
|
|
|
|
+ end;
|
|
|
|
+ {$ifndef patch112}
|
|
|
|
+ if (k > 7) then { return unused byte, if any }
|
|
|
|
+ begin
|
|
|
|
+ {$IFDEF ZLIB_DEBUG}
|
|
|
|
+ Assert(k < 16, 'inflate_codes grabbed too many bytes');
|
|
|
|
+ {$ENDIF}
|
|
|
|
+ dec(k, 8);
|
|
|
|
+ inc(n);
|
|
|
|
+ dec(p); { can always return one }
|
|
|
|
+ end;
|
|
|
|
+ {$endif}
|
|
|
|
+ s.mode := DRY;
|
|
|
|
+ do_codes:=true;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ procedure do_dry;
|
|
|
|
+
|
|
|
|
+ begin
|
|
|
|
+ {FLUSH}
|
|
|
|
+ s.write := q;
|
|
|
|
+ r := inflate_flush(s,z,r);
|
|
|
|
+ q := s.write;
|
|
|
|
+
|
|
|
|
+ { not needed anymore, we are done:
|
|
|
|
+ if ptruint(q) < ptruint(s.read) then
|
|
|
|
+ m := cardinal(ptruint(s.read)-ptruint(q)-1)
|
|
|
|
+ else
|
|
|
|
+ m := cardinal(ptruint(s.zend)-ptruint(q));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (s.read <> s.write) then
|
|
|
|
+ begin
|
|
|
|
+ { update pointers and return }
|
|
|
|
+ s.bitb := b;
|
|
|
|
+ s.bitk := k;
|
|
|
|
+ z.avail_in := n;
|
|
|
|
+ Inc(z.total_in, ptruint(p) - ptruint(z.next_in));
|
|
|
|
+ z.next_in := p;
|
|
|
|
+ s.write := q;
|
|
|
|
+ inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
|
|
+ s.mode := BLKDONE;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ procedure do_blkdone;
|
|
|
|
+
|
|
|
|
+ begin
|
|
|
|
+ r := Z_STREAM_END;
|
|
|
|
+ { update pointers and return }
|
|
|
|
+ s.bitb := b;
|
|
|
|
+ s.bitk := k;
|
|
|
|
+ z.avail_in := n;
|
|
|
|
+ Inc(z.total_in, ptruint(p) - ptruint(z.next_in));
|
|
|
|
+ z.next_in := p;
|
|
|
|
+ s.write := q;
|
|
|
|
+ inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
+ end;
|
|
|
|
+
|
|
begin
|
|
begin
|
|
{ copy input/output information to locals }
|
|
{ copy input/output information to locals }
|
|
p := z.next_in;
|
|
p := z.next_in;
|
|
@@ -542,350 +880,50 @@ begin
|
|
s.mode := BTREE;
|
|
s.mode := BTREE;
|
|
{ fall trough case is handled by the while }
|
|
{ fall trough case is handled by the while }
|
|
{ try GOTO for speed - Nomssi }
|
|
{ try GOTO for speed - Nomssi }
|
|
- goto start_btree;
|
|
|
|
|
|
+ do_btree;
|
|
|
|
+ do_dtree;
|
|
|
|
+ if not do_codes then
|
|
|
|
+ continue;
|
|
|
|
+ do_dry;
|
|
|
|
+ do_blkdone;
|
|
|
|
+ exit;
|
|
end;
|
|
end;
|
|
BTREE:
|
|
BTREE:
|
|
begin
|
|
begin
|
|
- start_btree:
|
|
|
|
- while (s.sub.trees.index < 4 + (s.sub.trees.table shr 10)) do
|
|
|
|
- begin
|
|
|
|
- {NEEDBITS(3);}
|
|
|
|
- while (k < 3) 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, ptruint(p)-ptruint(z.next_in));
|
|
|
|
- z.next_in := p;
|
|
|
|
- s.write := q;
|
|
|
|
- inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
- exit;
|
|
|
|
- end;
|
|
|
|
- dec(n);
|
|
|
|
- b := b or (cardinal(p^) shl k);
|
|
|
|
- Inc(p);
|
|
|
|
- Inc(k, 8);
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
- s.sub.trees.blens^[border[s.sub.trees.index]] := cardinal(b) and 7;
|
|
|
|
- Inc(s.sub.trees.index);
|
|
|
|
- {DUMPBITS(3);}
|
|
|
|
- b := b shr 3;
|
|
|
|
- dec(k, 3);
|
|
|
|
- end;
|
|
|
|
- while (s.sub.trees.index < 19) do
|
|
|
|
- begin
|
|
|
|
- s.sub.trees.blens^[border[s.sub.trees.index]] := 0;
|
|
|
|
- Inc(s.sub.trees.index);
|
|
|
|
- end;
|
|
|
|
- s.sub.trees.bb := 7;
|
|
|
|
- t := inflate_trees_bits(s.sub.trees.blens^, s.sub.trees.bb,
|
|
|
|
- s.sub.trees.tb, s.hufts^, z);
|
|
|
|
- if (t <> Z_OK) then
|
|
|
|
- begin
|
|
|
|
- freemem(s.sub.trees.blens);
|
|
|
|
- s.sub.trees.blens := nil;
|
|
|
|
- r := t;
|
|
|
|
- if (r = Z_DATA_ERROR) then
|
|
|
|
- s.mode := BLKBAD;
|
|
|
|
- { update pointers and return }
|
|
|
|
- s.bitb := b;
|
|
|
|
- s.bitk := k;
|
|
|
|
- z.avail_in := n;
|
|
|
|
- Inc(z.total_in, ptruint(p) - ptruint(z.next_in));
|
|
|
|
- z.next_in := p;
|
|
|
|
- s.write := q;
|
|
|
|
- inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
- exit;
|
|
|
|
- end;
|
|
|
|
- s.sub.trees.index := 0;
|
|
|
|
- {$IFDEF ZLIB_DEBUG}
|
|
|
|
- Tracev('inflate: bits tree ok');
|
|
|
|
- {$ENDIF}
|
|
|
|
- s.mode := DTREE;
|
|
|
|
- { fall through again }
|
|
|
|
- goto start_dtree;
|
|
|
|
|
|
+ do_btree;
|
|
|
|
+ do_dtree;
|
|
|
|
+ if not do_codes then
|
|
|
|
+ continue;
|
|
|
|
+ do_dry;
|
|
|
|
+ do_blkdone;
|
|
|
|
+ exit;
|
|
end;
|
|
end;
|
|
DTREE:
|
|
DTREE:
|
|
begin
|
|
begin
|
|
- start_dtree:
|
|
|
|
- while TRUE do
|
|
|
|
- begin
|
|
|
|
- t := s.sub.trees.table;
|
|
|
|
- if not (s.sub.trees.index < 258 +
|
|
|
|
- (t and $1f) + ((t shr 5) and $1f)) then
|
|
|
|
- break;
|
|
|
|
- t := s.sub.trees.bb;
|
|
|
|
- {NEEDBITS(t);}
|
|
|
|
- while (k < t) 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, ptruint(p)-ptruint(z.next_in));
|
|
|
|
- z.next_in := p;
|
|
|
|
- s.write := q;
|
|
|
|
- inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
- exit;
|
|
|
|
- end;
|
|
|
|
- dec(n);
|
|
|
|
- b := b or (cardinal(p^) shl k);
|
|
|
|
- Inc(p);
|
|
|
|
- Inc(k, 8);
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
- h := s.sub.trees.tb;
|
|
|
|
- Inc(h, cardinal(b) and inflate_mask[t]);
|
|
|
|
- t := h^.Bits;
|
|
|
|
- c := h^.Base;
|
|
|
|
-
|
|
|
|
- if (c < 16) then
|
|
|
|
- begin
|
|
|
|
- {DUMPBITS(t);}
|
|
|
|
- b := b shr t;
|
|
|
|
- dec(k, t);
|
|
|
|
-
|
|
|
|
- s.sub.trees.blens^[s.sub.trees.index] := c;
|
|
|
|
- Inc(s.sub.trees.index);
|
|
|
|
- end
|
|
|
|
- else { c = 16..18 }
|
|
|
|
- begin
|
|
|
|
- if c = 18 then
|
|
|
|
- begin
|
|
|
|
- i := 7;
|
|
|
|
- j := 11;
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- i := c - 14;
|
|
|
|
- j := 3;
|
|
|
|
- end;
|
|
|
|
- {NEEDBITS(t + i);}
|
|
|
|
- while (k < t + i) 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, ptruint(p)-ptruint(z.next_in));
|
|
|
|
- z.next_in := p;
|
|
|
|
- s.write := q;
|
|
|
|
- inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
- exit;
|
|
|
|
- end;
|
|
|
|
- dec(n);
|
|
|
|
- b := b or (cardinal(p^) shl k);
|
|
|
|
- Inc(p);
|
|
|
|
- Inc(k, 8);
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
- {DUMPBITS(t);}
|
|
|
|
- b := b shr t;
|
|
|
|
- dec(k, t);
|
|
|
|
-
|
|
|
|
- Inc(j, cardinal(b) and inflate_mask[i]);
|
|
|
|
- {DUMPBITS(i);}
|
|
|
|
- b := b shr i;
|
|
|
|
- dec(k, i);
|
|
|
|
-
|
|
|
|
- i := s.sub.trees.index;
|
|
|
|
- t := s.sub.trees.table;
|
|
|
|
- if (i + j > 258 + (t and $1f) + ((t shr 5) and $1f)) or
|
|
|
|
- ((c = 16) and (i < 1)) then
|
|
|
|
- begin
|
|
|
|
- freemem(s.sub.trees.blens);
|
|
|
|
- s.sub.trees.blens := nil;
|
|
|
|
- s.mode := BLKBAD;
|
|
|
|
- z.msg := 'invalid bit length repeat';
|
|
|
|
- r := Z_DATA_ERROR;
|
|
|
|
- { update pointers and return }
|
|
|
|
- s.bitb := b;
|
|
|
|
- s.bitk := k;
|
|
|
|
- z.avail_in := n;
|
|
|
|
- Inc(z.total_in, ptruint(p) - ptruint(z.next_in));
|
|
|
|
- z.next_in := p;
|
|
|
|
- s.write := q;
|
|
|
|
- inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
- exit;
|
|
|
|
- end;
|
|
|
|
- if c = 16 then
|
|
|
|
- c := s.sub.trees.blens^[i - 1]
|
|
|
|
- else
|
|
|
|
- c := 0;
|
|
|
|
- repeat
|
|
|
|
- s.sub.trees.blens^[i] := c;
|
|
|
|
- Inc(i);
|
|
|
|
- dec(j);
|
|
|
|
- until (j=0);
|
|
|
|
- s.sub.trees.index := i;
|
|
|
|
- end;
|
|
|
|
- end; { while }
|
|
|
|
- s.sub.trees.tb := nil;
|
|
|
|
- begin
|
|
|
|
- bl := 9; { must be <= 9 for lookahead assumptions }
|
|
|
|
- bd := 6; { must be <= 9 for lookahead assumptions }
|
|
|
|
- t := s.sub.trees.table;
|
|
|
|
- t := inflate_trees_dynamic(257 + (t and $1f),
|
|
|
|
- 1 + ((t shr 5) and $1f),
|
|
|
|
- s.sub.trees.blens^, bl, bd, tl, td, s.hufts^, z);
|
|
|
|
- freemem(s.sub.trees.blens);
|
|
|
|
- s.sub.trees.blens := nil;
|
|
|
|
- if (t <> Z_OK) then
|
|
|
|
- begin
|
|
|
|
- if (t = cardinal(Z_DATA_ERROR)) then
|
|
|
|
- s.mode := BLKBAD;
|
|
|
|
- r := t;
|
|
|
|
- { update pointers and return }
|
|
|
|
- s.bitb := b;
|
|
|
|
- s.bitk := k;
|
|
|
|
- z.avail_in := n;
|
|
|
|
- Inc(z.total_in, ptruint(p) - ptruint(z.next_in));
|
|
|
|
- z.next_in := p;
|
|
|
|
- s.write := q;
|
|
|
|
- inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
- exit;
|
|
|
|
- end;
|
|
|
|
- {$IFDEF ZLIB_DEBUG}
|
|
|
|
- Tracev('inflate: trees ok');
|
|
|
|
- {$ENDIF}
|
|
|
|
- { c renamed to cs }
|
|
|
|
- cs := inflate_codes_new(bl, bd, tl, td, z);
|
|
|
|
- if (cs = nil) then
|
|
|
|
- begin
|
|
|
|
- r := Z_MEM_ERROR;
|
|
|
|
- { update pointers and return }
|
|
|
|
- s.bitb := b;
|
|
|
|
- s.bitk := k;
|
|
|
|
- z.avail_in := n;
|
|
|
|
- Inc(z.total_in, ptruint(p) - ptruint(z.next_in));
|
|
|
|
- z.next_in := p;
|
|
|
|
- s.write := q;
|
|
|
|
- inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
- exit;
|
|
|
|
- end;
|
|
|
|
- s.sub.decode.codes := cs;
|
|
|
|
- end;
|
|
|
|
- s.mode := CODES;
|
|
|
|
- { yet another falltrough }
|
|
|
|
- goto start_codes;
|
|
|
|
|
|
+ do_dtree;
|
|
|
|
+ if not do_codes then
|
|
|
|
+ continue;
|
|
|
|
+ do_dry;
|
|
|
|
+ do_blkdone;
|
|
|
|
+ exit;
|
|
end;
|
|
end;
|
|
CODES:
|
|
CODES:
|
|
begin
|
|
begin
|
|
- start_codes:
|
|
|
|
- { update pointers }
|
|
|
|
- s.bitb := b;
|
|
|
|
- s.bitk := k;
|
|
|
|
- z.avail_in := n;
|
|
|
|
- Inc(z.total_in, ptruint(p) - ptruint(z.next_in));
|
|
|
|
- z.next_in := p;
|
|
|
|
- s.write := q;
|
|
|
|
-
|
|
|
|
- r := inflate_codes(s, z, r);
|
|
|
|
- if (r <> Z_STREAM_END) then
|
|
|
|
- begin
|
|
|
|
- inflate_blocks := inflate_flush(s, z, r);
|
|
|
|
- exit;
|
|
|
|
- end;
|
|
|
|
- r := Z_OK;
|
|
|
|
- inflate_codes_free(s.sub.decode.codes, z);
|
|
|
|
- { load local pointers }
|
|
|
|
- p := z.next_in;
|
|
|
|
- n := z.avail_in;
|
|
|
|
- b := s.bitb;
|
|
|
|
- k := s.bitk;
|
|
|
|
- q := s.write;
|
|
|
|
- if ptruint(q) < ptruint(s.read) then
|
|
|
|
- m := cardinal(ptruint(s.read)-ptruint(q)-1)
|
|
|
|
- else
|
|
|
|
- m := cardinal(ptruint(s.zend)-ptruint(q));
|
|
|
|
- {$IFDEF ZLIB_DEBUG}
|
|
|
|
- if (ptruint(q) >= ptruint(s.read)) then
|
|
|
|
- Tracev('inflate: codes end '+
|
|
|
|
- IntToStr(z.total_out + ptruint(q) - ptruint(s.read)) + ' total out')
|
|
|
|
- else
|
|
|
|
- Tracev('inflate: codes end '+
|
|
|
|
- IntToStr(z.total_out + ptruint(s.zend) - ptruint(s.read) +
|
|
|
|
- ptruint(q) - ptruint(s.window)) + ' total out');
|
|
|
|
- {$ENDIF}
|
|
|
|
- if (not s.last) then
|
|
|
|
- begin
|
|
|
|
- s.mode := ZTYPE;
|
|
|
|
- continue; { break for switch statement in C-code }
|
|
|
|
- end;
|
|
|
|
- {$ifndef patch112}
|
|
|
|
- if (k > 7) then { return unused byte, if any }
|
|
|
|
- begin
|
|
|
|
- {$IFDEF ZLIB_DEBUG}
|
|
|
|
- Assert(k < 16, 'inflate_codes grabbed too many bytes');
|
|
|
|
- {$ENDIF}
|
|
|
|
- dec(k, 8);
|
|
|
|
- inc(n);
|
|
|
|
- dec(p); { can always return one }
|
|
|
|
- end;
|
|
|
|
- {$endif}
|
|
|
|
- s.mode := DRY;
|
|
|
|
- { another falltrough }
|
|
|
|
- goto start_dry;
|
|
|
|
|
|
+ if not do_codes then
|
|
|
|
+ continue;
|
|
|
|
+ do_dry;
|
|
|
|
+ do_blkdone;
|
|
|
|
+ exit;
|
|
end;
|
|
end;
|
|
DRY:
|
|
DRY:
|
|
begin
|
|
begin
|
|
- start_dry:
|
|
|
|
- {FLUSH}
|
|
|
|
- s.write := q;
|
|
|
|
- r := inflate_flush(s,z,r);
|
|
|
|
- q := s.write;
|
|
|
|
-
|
|
|
|
- { not needed anymore, we are done:
|
|
|
|
- if ptruint(q) < ptruint(s.read) then
|
|
|
|
- m := cardinal(ptruint(s.read)-ptruint(q)-1)
|
|
|
|
- else
|
|
|
|
- m := cardinal(ptruint(s.zend)-ptruint(q));
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (s.read <> s.write) then
|
|
|
|
- begin
|
|
|
|
- { update pointers and return }
|
|
|
|
- s.bitb := b;
|
|
|
|
- s.bitk := k;
|
|
|
|
- z.avail_in := n;
|
|
|
|
- Inc(z.total_in, ptruint(p) - ptruint(z.next_in));
|
|
|
|
- z.next_in := p;
|
|
|
|
- s.write := q;
|
|
|
|
- inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
- exit;
|
|
|
|
- end;
|
|
|
|
- s.mode := BLKDONE;
|
|
|
|
- goto start_blkdone;
|
|
|
|
|
|
+ do_dry;
|
|
|
|
+ do_blkdone;
|
|
|
|
+ exit;
|
|
end;
|
|
end;
|
|
BLKDONE:
|
|
BLKDONE:
|
|
begin
|
|
begin
|
|
- start_blkdone:
|
|
|
|
- r := Z_STREAM_END;
|
|
|
|
- { update pointers and return }
|
|
|
|
- s.bitb := b;
|
|
|
|
- s.bitk := k;
|
|
|
|
- z.avail_in := n;
|
|
|
|
- Inc(z.total_in, ptruint(p) - ptruint(z.next_in));
|
|
|
|
- z.next_in := p;
|
|
|
|
- s.write := q;
|
|
|
|
- inflate_blocks := inflate_flush(s,z,r);
|
|
|
|
|
|
+ do_blkdone;
|
|
exit;
|
|
exit;
|
|
end;
|
|
end;
|
|
BLKBAD:
|
|
BLKBAD:
|