; CONTINUE; k:=start[Len]; nextCode:=k+weight[Len]; IF Len<=TableBits THEN BEGIN FOR i:=k TO PRED(nextCode) DO Table^[i]:=ch; END ELSE BEGIN p:=Addr(Table^[word(k) SHR jutbits]);i:=Len-TableBits; WHILE i<>0 DO BEGIN IF p^[0]=0 THEN BEGIN right^[Avail]:=0;left^[Avail]:=0;p^[0]:=Avail;INC(Avail); END; IF (k AND mask)<>0 THEN p:=addr(right^[p^[0]]) ELSE p:=addr(left^[p^[0]]); k:=k SHL 1;DEC(i); END; p^[0]:=ch; END; start[Len]:=nextCode; END; END;
PROCEDURE ReadPtLen(nn,nBit,ispecial:TwoByteInt); VAR i,c,n:TwoByteInt; mask:Word; BEGIN n:=GetBits(nBit); IF n=0 THEN BEGIN c:=GetBits(nBit); FOR i:=0 TO PRED(nn) DO PtLen[i]:=0; FOR i:=0 TO 255 DO PtTable[i]:=c; END ELSE BEGIN i:=0; WHILE (i<n) DO BEGIN c:=BitBuf SHR (BITBUFSIZ-3); IF c=7 THEN BEGIN mask:=1 SHL (BITBUFSIZ-4); WHILE (mask AND BitBuf)<>0 DO BEGIN mask:=mask SHR 1;INC(c); END; END; IF c<7 THEN FillBuf(3) ELSE FillBuf(c-3); PtLen[i]:=c;INC(i); IF i=ispecial THEN BEGIN c:=PRED(TwoByteInt(GetBits(2))); WHILE c>=0 DO BEGIN PtLen[i]:=0;INC(i);DEC(c); END; END; END; WHILE i<nn DO BEGIN PtLen[i]:=0;INC(i); END; MakeTable(nn,@PtLen,8,@PtTable); END; END;
PROCEDURE ReadCLen; VAR i,c,n:TwoByteInt; mask:Word; BEGIN n:=GetBits(CBIT); IF n=0 THEN BEGIN 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; END;
{declared as static vars} VAR decode_i:Word; decode_j:TwoByteInt;
PROCEDURE DecodeBuffer(count:Word;Buffer:PByte); VAR c,r:Word; BEGIN r:=0;DEC(decode_j); WHILE (decode_j>=0) DO BEGIN Buffer^[r]:=Buffer^[decode_i];decode_i:=SUCC(decode_i) AND PRED(DICSIZ); INC(r); IF r=count THEN   上一页 [1] [2] [3] [4] [5] [6] [7] 下一页 |