#include #include #include #include #include ringbuffer_t *make_ringbuffer(size_t size) { ringbuffer_t *ret = kmalloc(sizeof(ringbuffer_t)); uint8_t *data = kmalloc(size * sizeof(uint8_t)); *ret = (ringbuffer_t){ .size = 0, .cap = size, .data = data, .read = data, .write = data, }; return ret; } int ringbuffer_push(ringbuffer_t *buf, uint8_t val) { if (buf->size == buf->cap) return ERR_OUT_OF_BOUND; *buf->write++ = val; if (buf->write == buf->data + buf->cap) buf->write = buf->data; ++buf->size; return NO_ERROR; } uint8_t ringbuffer_bump(ringbuffer_t *buf) { if (buf->size == 0) exit(ERR_INVALID_OP); uint8_t ret = *buf->read++; if (buf->read == buf->data + buf->cap) buf->read = buf->data; --buf->size; return ret; } uint8_t ringbuffer_peek(ringbuffer_t *buf) { if (buf->size == 0) exit(ERR_INVALID_OP); return *buf->read; }