diff --git a/driver.c b/driver.c index 2bfd934..30fbf78 100644 --- a/driver.c +++ b/driver.c @@ -6,14 +6,16 @@ #define rb_size_t size_t #include "ringbuf.h" -int main(void) { +int +main(void) +{ struct RingBuf rb; rb_init(&rb, 10, malloc, sizeof(int)); - int data[] = {1, 2, 3, 4, 5}; + int data[] = { 1, 2, 3, 4, 5 }; rb_push(&rb, (void **)data, 5, memcpy); // rb_destroy(&rb, free); return 0; -} \ No newline at end of file +} diff --git a/ringbuf.c b/ringbuf.c index bf9b85b..6039967 100644 --- a/ringbuf.c +++ b/ringbuf.c @@ -1,9 +1,17 @@ /* SPDX-License-Identifier: MIT */ +#include +#include +#include + #include "ringbuf.h" -void rb_init(struct RingBuf *rb, rb_size_t capacity, void *(*alloc)(rb_size_t), - rb_size_t struct_size) { +#define ALLOC_T void *(*alloc)(rb_size_t) +#define MEMCPY_T void *(*memcpy)(void *, const void *, rb_size_t) + +void +rb_init(struct RingBuf *rb, rb_size_t capacity, ALLOC_T, rb_size_t struct_size) +{ rb->struct_size = struct_size; rb->capacity = capacity; rb->write_idx = 0; @@ -11,21 +19,37 @@ void rb_init(struct RingBuf *rb, rb_size_t capacity, void *(*alloc)(rb_size_t), rb->buffer = alloc(capacity * struct_size); /* Calloc? */ } -void rb_destroy(struct RingBuf *rb, rb_size_t(free)(void *)) { +void +rb_destroy(struct RingBuf *rb, rb_size_t(free)(void *)) +{ free(rb->buffer); } -enum WriteResult rb_push(struct RingBuf *rb, void *data[], rb_size_t amount, - void *(*memcpy)(void *, const void *, rb_size_t)) { - if (rb->write_idx + amount >= rb->capacity) { +enum WriteResult +rb_push(struct RingBuf *rb, void *data[], rb_size_t amount, MEMCPY_T) +{ + if(rb->write_idx + amount >= rb->capacity) { return CollisionError; } - for (rb_size_t i = 0; i < amount; i++) { - memcpy(rb->buffer + rb->write_idx * rb->struct_size, data[i], - rb->struct_size); + printf("write_idx: %d\n", rb->write_idx); + printf("amount: %d\n", amount); + + for(rb_size_t i = 0; i < amount; i++) { + printf("memcpy: %d, write_idx: %d\n", i, rb->write_idx); + // write to the buffer + rb->buffer[rb->write_idx] = data[i]; + // memcpy(rb->buffer + rb->write_idx * rb->struct_size, data[i], rb->struct_size); + rb->write_idx = (rb->write_idx + 1) % rb->capacity; } + // Read it back to stdout + for(rb_size_t i = 0; i < amount; i++) { + printf("read_idx: %d\n", rb->read_idx); + printf("data: %d\n", *(int *)rb->buffer[rb->read_idx]); + rb->read_idx = (rb->read_idx + 1) % rb->capacity; + } + return Ok; -} \ No newline at end of file +} diff --git a/ringbuf.h b/ringbuf.h index 9c28559..8ef2569 100644 --- a/ringbuf.h +++ b/ringbuf.h @@ -14,18 +14,17 @@ struct RingBuf { rb_size_t capacity; /* The physical capacity of the entire ringbuf */ rb_size_t write_idx; /* The write head */ rb_size_t read_idx; /* THe read head */ - void **buffer; /* The actual data */ + void **buffer; /* The actual data */ }; enum WriteResult { CollisionError, Ok }; /** Initialize the ring buffer */ -void rb_init(struct RingBuf *rb, rb_size_t capacity, void *(*alloc)(rb_size_t), - rb_size_t struct_size); +void rb_init(struct RingBuf *rb, rb_size_t capacity, void *(*alloc)(rb_size_t), rb_size_t struct_size); /** Insert data to the ring buffer */ enum WriteResult rb_push(struct RingBuf *rb, void *data[], rb_size_t amount, void *(*memcpy)(void *, const void *, rb_size_t)); /** Read data from the ring buffer */ -// void *rb_read(struct RingBuf *rb, int amount); \ No newline at end of file +// void *rb_read(struct RingBuf *rb, int amount);