#include "cReactor.h"
struct _cReactorBuffer
{
unsigned char * memory;
unsigned int memory_size;
unsigned char * read_ptr;
unsigned char * write_ptr;
};
cReactorBuffer *
cReactorBuffer_New(unsigned int size)
{
cReactorBuffer *buf;
buf = (cReactorBuffer *)malloc(sizeof(cReactorBuffer));
buf->memory = (unsigned char *)malloc(size);
buf->memory_size = size;
buf->read_ptr = buf->memory;
buf->write_ptr = buf->memory;
return buf;
}
void
cReactorBuffer_Destroy(cReactorBuffer *buffer)
{
if (buffer)
{
free(buffer->memory);
free(buffer);
}
}
void
cReactorBuffer_Write(cReactorBuffer *buffer, const void *data, unsigned int size)
{
unsigned int used;
unsigned int avail;
unsigned int pre_read;
unsigned int new_size;
unsigned char *new_mem;
used = buffer->write_ptr - buffer->read_ptr;
avail = (buffer->memory + buffer->memory_size) - buffer->write_ptr;
if (avail < size)
{
pre_read = buffer->read_ptr - buffer->memory;
if ((avail + pre_read) >= size)
{
memmove(buffer->memory, buffer->read_ptr, used);
buffer->read_ptr = buffer->memory;
buffer->write_ptr -= pre_read;
}
else
{
new_size = (buffer->memory_size * 2) + size;
new_mem = (unsigned char *)malloc(new_size);
memcpy(new_mem, buffer->read_ptr, used);
buffer->write_ptr = new_mem + used;
buffer->read_ptr = new_mem;
buffer->memory_size = new_size;
free(buffer->memory);
buffer->memory = new_mem;
}
}
memcpy(buffer->write_ptr, data, size);
buffer->write_ptr += size;
}
unsigned int
cReactorBuffer_DataAvailable(cReactorBuffer *buffer)
{
return (buffer
? (buffer->write_ptr - buffer->read_ptr)
: 0);
}
const unsigned char *
cReactorBuffer_GetPtr(cReactorBuffer *buffer)
{
return buffer->read_ptr;
}
void
cReactorBuffer_Seek(cReactorBuffer *buffer, unsigned int forward)
{
unsigned int avail;
avail = (buffer->write_ptr - buffer->read_ptr);
if (forward >= avail)
{
buffer->write_ptr = buffer->memory;
buffer->read_ptr = buffer->memory;
}
else
{
buffer->read_ptr += forward;
}
}