blob: e9f293501e630b2175f784b7c32d837535b2cb4b [file] [log] [blame]
part of archive;
class Bz2BitWriter {
OutputStream output;
Bz2BitWriter(this.output);
void writeByte(int byte) => writeBits(8, byte);
void writeBytes(List<int> bytes) {
for (int i = 0; i < bytes.length; ++i) {
writeBits(8, bytes[i]);
}
}
void writeUint16(int value) {
writeBits(16, value);
}
void writeUint24(int value) {
writeBits(24, value);
}
void writeUint32(int value) {
writeBits(32, value);
}
void writeBits(int numBits, int value) {
// TODO optimize
if (_bitPos == 8 && numBits == 8) {
output.writeByte(value & 0xff);
return;
}
if (_bitPos == 8 && numBits == 16) {
output.writeByte((value >> 8) & 0xff);
output.writeByte(value & 0xff);
return;
}
if (_bitPos == 8 && numBits == 24) {
output.writeByte((value >> 16) & 0xff);
output.writeByte((value >> 8) & 0xff);
output.writeByte(value & 0xff);
return;
}
if (_bitPos == 8 && numBits == 32) {
output.writeByte((value >> 24) & 0xff);
output.writeByte((value >> 16) & 0xff);
output.writeByte((value >> 8) & 0xff);
output.writeByte(value & 0xff);
return;
}
while (numBits > 0) {
numBits--;
int b = (value >> numBits) & 0x1;
_bitBuffer = (_bitBuffer << 1) | b;
_bitPos--;
if (_bitPos == 0) {
output.writeByte(_bitBuffer);
_bitPos = 8;
_bitBuffer = 0;
}
}
}
/**
* Write any remaining bits from the buffer to the output, padding the
* remainder of the byte with 0's.
*/
void flush() {
if (_bitPos != 8) {
writeBits(_bitPos, 0);
}
}
int _bitBuffer = 0;
int _bitPos = 8;
}