From 1291482ebf40477b8e32d89c79c0917acea1434b Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 29 Jul 2000 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2000-07-29 --- mpc/unsac.c | 63 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/mpc/unsac.c b/mpc/unsac.c index 2b259cc24cdd1c2f7c1c1a81419109e52590c2ad..a8d2a2b0a2c775005bf0e0447eba332045823c72 100644 --- a/mpc/unsac.c +++ b/mpc/unsac.c @@ -64,7 +64,7 @@ static int mtf(uchar*, int); #define FORWARD 0 -void +static void mtflistinit(Mtf *m, uchar *front, int n) { int last, me, f, i, comb; @@ -125,7 +125,7 @@ mtflistinit(Mtf *m, uchar *front, int n) m->maxcomb = comb; } -int +static int mtflist(Mtf *m, int pos) { uchar *next, *prev, *mycomb; @@ -361,20 +361,19 @@ fillbits(Decode *dec) * decode one symbol */ static int -hdecsym(Decode *dec, Huff *h) +hdecsym(Decode *dec, Huff *h, int b) { long c; ulong bits; - int b, nbits; + int nbits; bits = dec->bits; - b = h->flatbits; - nbits = dec->nbits - b; - for(; (c = bits >> nbits) > h->maxcode[b]; b++) - nbits--; + nbits = dec->nbits; + for(; (c = bits >> (nbits - b)) > h->maxcode[b]; b++) + ; if(b > h->maxbits) fatal(dec, "too many bits consumed"); - dec->nbits = nbits; + dec->nbits = nbits - b; return h->decode[h->last[b] - c]; } @@ -382,19 +381,19 @@ static int hdec(Decode *dec) { ulong c; - int nbits; + int nbits, nb; if(dec->nbits < dec->tab.maxbits) fillbits(dec); nbits = dec->nbits; dec->bits &= (1 << nbits) - 1; c = dec->tab.flat[dec->bits >> (nbits - dec->tab.flatbits)]; - if(c == ~0) - c = hdecsym(dec, &dec->tab); - else{ - dec->nbits = nbits - (c & 0xff); - c >>= 8; - } + nb = c & 0xff; + c >>= 8; + if(nb == 0xff) + c = hdecsym(dec, &dec->tab, c); + else + dec->nbits = nbits - nb; /* * reverse funny run-length coding @@ -413,7 +412,7 @@ hdec(Decode *dec) static void hufftab(Decode *dec, Huff *h, char *hb, ulong *bitcount, int maxleaf, int maxbits, int flatbits) { - ulong c, code, nc[MaxHuffBits]; + ulong c, mincode, code, nc[MaxHuffBits]; int i, b, ec; h->maxbits = maxbits; @@ -425,8 +424,9 @@ hufftab(Decode *dec, Huff *h, char *hb, ulong *bitcount, int maxleaf, int maxbit for(b = 0; b <= maxbits; b++){ h->last[b] = c; c += bitcount[b]; - nc[b] = code << 1; - code = (code << 1) + bitcount[b]; + mincode = code << 1; + nc[b] = mincode; + code = mincode + bitcount[b]; if(code > (1 << b)) fatal(dec, "corrupted huffman table"); h->maxcode[b] = code - 1; @@ -442,6 +442,19 @@ hufftab(Decode *dec, Huff *h, char *hb, ulong *bitcount, int maxleaf, int maxbit for(i = 0; i < b; i++) h->flat[i] = ~0; + /* + * initialize the flat table to include the minimum possible + * bit length for each code prefix + */ + for(b = maxbits; b > flatbits; b--){ + code = h->maxcode[b]; + mincode = code + 1 - bitcount[b]; + mincode >>= b - flatbits; + code >>= b - flatbits; + for(; code >= mincode; code--) + h->flat[code] = (b << 8) | 0xff; + } + for(i = 0; i < maxleaf; i++){ b = hb[i]; if(b == -1) @@ -569,12 +582,12 @@ recvtab(Decode *dec, Huff *tab, int maxleaf, ushort *map) fillbits(dec); dec->bits &= (1 << dec->nbits) - 1; m = tab->flat[dec->bits >> (dec->nbits - tab->flatbits)]; - if(m == ~0) - m = hdecsym(dec, tab); - else{ - dec->nbits -= m & 0xff; - m >>= 8; - } + b = m & 0xff; + m >>= 8; + if(b == 0xff) + m = hdecsym(dec, tab, m); + else + dec->nbits -= b; b = tmtf[m]; for(; m > 0; m--) tmtf[m] = tmtf[m-1];