c:=getbits(cbit);
for i:=0 to pred(nc) do
clen^[i]:=0;
for i:=0 to 4095 do
ctable^[i]:=c;
end else begin
i:=0;
while i<n do begin
c:=pttable[bitbuf shr (bitbufsiz-8)];
if c>=nt then
begin
mask:=1 shl (bitbufsiz-9);
repeat
if (bitbuf and mask)<>0 then
c:=right^[c]
else
c:=left^[c];
mask:=mask shr 1;
until c<nt;
end;
fillbuf(ptlen[c]);
if c<=2 then
begin
if c=1 then
c:=2+getbits(4)
else
if c=2 then
c:=19+getbits(cbit);
while c>=0 do begin
clen^[i]:=0;inc(i);dec(c);
end;
end else begin
clen^[i]:=c-2;inc(i);
end;
end;
while i<nc do begin
clen^[i]:=0;inc(i);
end;
maketable(nc,pbyte(clen),12,pword(ctable));
end;
end;
function decodec:word;
var
j,mask:word;
begin
if blocksize=0 then
begin
blocksize:=getbits(16);
readptlen(nt,tbit,3);
readclen;
readptlen(np,pbit,-1);
end;
dec(blocksize);
j:=ctable^[bitbuf shr (bitbufsiz-12)];
if j>=nc then
begin
mask:=1 shl (bitbufsiz-13);
repeat
if (bitbuf and mask)<>0 then
j:=right^[j]
else
j:=left^[j];
mask:=mask shr 1;
until j<nc;
end;
fillbuf(clen^[j]);
decodec:=j;
end;
function decodep:word;
var
j,mask:word;
begin
j:=pttable[bitbuf shr (bitbufsiz-8)];
if j>=np then
begin
mask:=1 shl (bitbufsiz-9);
repeat
if (bitbuf and mask)<>0 then
j:=right^[j]
else
j:=left^[j];
mask:=mask shr 1;
until j<np;
end;
fillbuf(ptlen[j]);
if j<>0 then
begin
dec(j);j:=(1 shl j)+getbits(j);
end;
decodep:=j;