#include #include #include #include #include "ringbuffer.h" void _ringBufferIncReader(struct ringBuffer *buf) { buf->reader += buf->blockSize; if (buf->reader >= buf->blocks * buf->blockSize) { buf->reader = 0; } } void _ringBufferIncWriter(struct ringBuffer *buf) { buf->writer += buf->blockSize; if (buf->writer >= buf->blocks * buf->blockSize) { buf->writer = 0; } if (buf->writer == buf->reader) { // we incremented the writer and now it is equal to reader // this means, the writer is overtaking the reader // so push the reader forward, even if we are // loosing data but this is how ring buffers work, eh? _ringBufferIncReader(buf); } } void ringBufferCreate(int blocks, size_t blockSize, struct ringBuffer *out) { out->buffer = malloc(blocks * blockSize * sizeof(char)); out->blocks = blocks; out->blockSize = blockSize; out->reader = 0; out->writer = 0; } void ringBufferDestroy(struct ringBuffer *buf) { free(buf->buffer); } int ringBufferRead(struct ringBuffer *buf, char *out) { if (buf->reader != buf->writer) { // we have data to read memcpy(out, &buf->buffer[buf->reader], buf->blockSize * sizeof(char)); _ringBufferIncReader(buf); return 0; } else { // nothing to read return 1; } } void ringBufferWrite(struct ringBuffer *buf, char *in) { memcpy(&buf->buffer[buf->writer], in, buf->blockSize * sizeof(char)); _ringBufferIncWriter(buf); }