From 6d4ec19efb941b7e77bb0d20c831c8e90b87293a Mon Sep 17 00:00:00 2001 From: DualFroz Date: Sun, 6 Sep 2026 19:58:03 +0200 Subject: [PATCH] feat: add ringInit and ringClear --- src/ring.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/ring.c diff --git a/src/ring.c b/src/ring.c new file mode 100644 index 0000000..3b2bb6e --- /dev/null +++ b/src/ring.c @@ -0,0 +1,58 @@ +#include "ring.h" + +void ringInit(RingBuffer* r, uint8* backingBuffer, usize capacity) +{ + r->data = backingBuffer; + r->capacity = capacity; + r->head = 0; + r->count = 0; +} + +void ringClear(RingBuffer* r) +{ + r->head = 0; + r->count = 0; +} + +bool ringIsEmpty(const RingBuffer* r) { return r->count == 0; } +bool ringIsFull(const RingBuffer* r) { return r->count == r->capacity; } +usize ringCount(const RingBuffer* r) { return r->count; } +usize ringCapacity(const RingBuffer* r) { return r->capacity; } +usize ringFreeSpace(const RingBuffer* r) { return r->capacity - r->count; } + +bool ringPush(RingBuffer* r, uint8 byte) +{ + if (ringIsFull(r)) + return false; + usize tail = (r->head + r->count) % r->capacity; + r->data[tail] = byte; + r->count++; + return true; +} + +bool ringPop(RingBuffer* r, uint8* out) +{ + if (ringIsEmpty(r)) + return false; + if (out) + *out = r->data[r->head]; + r->head = (r->head + 1) % r->capacity; + r->count--; + return true; +} + +usize ringWrite(RingBuffer* r, const uint8* data, usize len) +{ + usize written = 0; + while (written < len && ringPush(r, data[written])) + written++; + return written; +} + +usize ringRead(RingBuffer* r, uint8* data, usize len) +{ + usize readCount = 0; + while (readCount < len && ringPop(r, &data[readCount])) + readCount++; + return readCount; +}