~kris/9p

9hist

1291482ebf40477b8e32d89c79c0917acea1434b — David du Colombier 26 years ago d35e66e
Plan 9 from Bell Labs 2000-07-29
1 files changed, 38 insertions(+), 25 deletions(-)

M mpc/unsac.c
M mpc/unsac.c => mpc/unsac.c +38 -25
@@ 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];