mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-06-10 11:59:58 -05:00
Initial community commit
This commit is contained in:
71
Src/nu/bitbuffer.cpp
Normal file
71
Src/nu/bitbuffer.cpp
Normal file
@ -0,0 +1,71 @@
|
||||
#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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user