
#ifndef ENTDEC_H
#define ENTDEC_H

#include "entcode.h"



static int rc_read_byte(ec_dec *_this)
{
	return _this->offs<_this->storage?_this->buf[_this->offs++]:0;
}


static int rc_read_byte_from_end(ec_dec *_this)
{
	return _this->end_offs<_this->storage?
			_this->buf[_this->storage-++(_this->end_offs)]:0;
}

static void dec_norm(ec_dec *_this)
{
	while(_this->rng<=EC_CODE_BOT)
	{
		int sym;
		_this->nbits_total+=EC_SYM_BITS;
		_this->rng<<=EC_SYM_BITS;
		sym=_this->rem;


		_this->rem=rc_read_byte(_this);
		sym=(sym<<EC_SYM_BITS|_this->rem)>>(EC_SYM_BITS-EC_CODE_EXTRA);

		_this->val=((_this->val<<EC_SYM_BITS)+(EC_SYM_MAX&~sym))&(EC_CODE_TOP);
	}
}



void rc_dec_init(ec_dec *_this,unsigned char *_buf,unsigned int _storage);


unsigned rc_dec(ec_dec *_this,unsigned _ft);
unsigned rc_dec_bin(ec_dec *_this,unsigned _bits);
void rc_dec_upd(ec_dec *curr_dec,unsigned il,unsigned ih,unsigned it);
int rc_dec_bit_logp(ec_dec *_this,unsigned _logp);
int rc_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb);
unsigned int rc_dec_uint(ec_dec *_this,unsigned int _ft);
unsigned int rc_dec_bits(ec_dec *_this,unsigned _ftb);

#endif
