#include "obitstream.h"

#include <iostream>
using namespace std;

COBitStream::COBitStream(void){
	m_fhd = 0;
	m_iFree = 32;
	m_lNotFull = 0;

	int i;
	long l =0;
	for(i=0; i<32; i++){
		m_plMask[i] = l;
		l<<=1;
		l|=1;
	}
}

COBitStream::~COBitStream(void){
	if(m_fhd){
		if(m_iFree != 32){
			fwrite(&m_lNotFull,sizeof(long),1,m_fhd);
			//cout << "~" << m_lNotFull << endl;
		}
		fclose(m_fhd);
	}
}

void COBitStream::write(long data, int bits){
	long lTemp;
	data &= m_plMask[bits];

	if(m_iFree == 0){
		fwrite(&m_lNotFull,sizeof(long),1,m_fhd);
		//cout << "n" << m_lNotFull << endl;
		m_lNotFull = 0;
		m_iFree = 32;
	}

	if(m_iFree - bits >= 0){
		lTemp = data;
		lTemp <<= (m_iFree - bits);
		m_lNotFull |= lTemp;
		m_iFree -= bits;
	}
	else{
		int iLeft = bits - m_iFree;
		lTemp = data;
		lTemp >>= (iLeft);
		lTemp &= m_plMask[m_iFree];
		m_lNotFull |= lTemp;

		m_iFree = 0;

		write(data,iLeft);
	}
}

void COBitStream::fopen(const char *sz1, const char *sz2){
	m_fhd = ::fopen(sz1,sz2);
}


/*long lTemp;
	int m_iLeft;

	lTemp = data;
	lTemp <<= m_iFree;
	m_lNotFull |= lTemp;
	m_iFree += bits;

	if(m_iFree >= sizeof(long) * 8){
		// we need some bytes more ... and we gotta gotta store this away
		fwrite(&m_lNotFull,sizeof(long),1,m_fhd);
		m_lNotFull = 0;
		m_iLeft = m_iFree;
		m_iFree = 0;
		m_iLeft -= (sizeof(long) * 8);
		if(m_iLeft){
			lTemp = data;

			lTemp >>= (bits - m_iLeft);

			write(lTemp,m_iLeft);
		}
	}*/
