mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-11-24 11:30:10 +01:00
71 lines
1.3 KiB
C++
71 lines
1.3 KiB
C++
#include "bitbuffer.h"
|
|
#include <memory.h>
|
|
#include <stdlib.h>
|
|
|
|
BitBuffer::BitBuffer()
|
|
{
|
|
buffer=0;
|
|
length=0;
|
|
bits=0;
|
|
}
|
|
|
|
void BitBuffer::WriteBit(char bit)
|
|
{
|
|
if (bits == 0)
|
|
Resize(length+1);
|
|
|
|
bit = !!bit;
|
|
unsigned char mask = 1 << (7-bits);
|
|
buffer[length-1] &= ~mask;
|
|
buffer[length-1] |= (bit << (7-bits));
|
|
bits=(bits+1)%8;
|
|
}
|
|
|
|
void BitBuffer::Resize(size_t newlen)
|
|
{
|
|
if (newlen > length)
|
|
{
|
|
unsigned char *new_buffer = (unsigned char *)realloc(buffer, newlen);
|
|
if (new_buffer)
|
|
{
|
|
buffer = new_buffer;
|
|
memset(buffer+length, 0, newlen-length); // zero out new data
|
|
length=newlen;
|
|
}
|
|
else
|
|
{
|
|
new_buffer = (unsigned char *)malloc(newlen);
|
|
if (new_buffer)
|
|
{
|
|
memcpy(new_buffer, buffer, length);
|
|
free(buffer);
|
|
buffer = new_buffer;
|
|
memset(buffer+length, 0, newlen-length); // zero out new data
|
|
length=newlen;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void BitBuffer::WriteBits(uintptr_t num, size_t bitlen)
|
|
{
|
|
for (size_t i=0;i!=bitlen;i++)
|
|
{
|
|
WriteBit((num >> (bitlen-i-1))&1);
|
|
}
|
|
}
|
|
|
|
void BitBuffer::WriteBytes(void *buffer, size_t bytes)
|
|
{
|
|
unsigned char *b = (unsigned char *)buffer;
|
|
for (size_t i=0;i!=bytes;i++)
|
|
WriteBits(b[i], 8);
|
|
}
|
|
|
|
void BitBuffer::WriteByte(unsigned char byte)
|
|
{
|
|
for (size_t i=0;i!=8;i++)
|
|
{
|
|
WriteBit((byte >> (7-i))&1);
|
|
}
|
|
} |