/* * @(#) bitstrea.cpp - I/O bit stream support functions library (source). * (c) 1998 Ivan Maidanski http://ivmai.chat.ru * Freeware function library source. All rights reserved. ** * Language: ISO/ANSI C++ * Tested with: Watcom C++ 16/32 v11.0 * Last modified: 1998-06-21 21:10:00 GMT+04:00 */ #include "bitstrea.h" // library header // implementation section ostream &BitPut(ostream &Stream, unsigned char &BufP, int Bit) { if (!BufP) BufP=(unsigned char)~((unsigned char)~0>>1); if (BufP&1) { BufP>>=1; if (Bit) BufP|=~((unsigned char)~0>>1); Stream.put(BufP); BufP=0; } else { BufP>>=1; if (Bit) BufP|=~((unsigned char)~0>>1); } return Stream; } ostream &BitFlush(ostream &Stream, unsigned char &BufP) { if (BufP) { while (!(BufP&1)) BufP>>=1; Stream.put(BufP>>=1); BufP=0; } return Stream; } int BitGet(istream &Stream, unsigned char &BufG) { unsigned char Prev=BufG; if (!(BufG>>=1)) BufG=(unsigned char)(((Prev=(unsigned char)Stream.get())>>1)| ~((unsigned char)~0>>1)); return Prev&1; } ostream &BitValPut(ostream &Stream, unsigned char &BufP, unsigned long Value, unsigned long MaxVal) { for (;MaxVal;Value>>=1,MaxVal>>=1) BitPut(Stream,BufP,(int)(Value&1)); return Stream; } unsigned long BitValGet(istream &Stream, unsigned char &BufG, unsigned long MaxVal, int &Wrapped) { unsigned long Value,Mask; for (Value=0,Mask=1;Mask && MaxVal>=Mask;Mask<<=1) if (BitGet(Stream,BufG)) Value|=Mask; Wrapped=Value>MaxVal; if (Wrapped) Value-=MaxVal+1; return Value; }