#include "ring_buffer.h" #include #include #include /* * Type definitions */ typedef struct { char *buffer; uint32_t head; uint32_t tail; uint32_t size; } ring_buffer_t; /* * Public API */ rb_handle_t rb_allocate(uint32_t size) { ring_buffer_t *rb = calloc(1, sizeof(ring_buffer_t)); if (!rb) { return NULL; } rb->buffer = malloc(size); if (!rb->buffer) { free(rb); rb = NULL; } rb->size = size; return rb; } void rb_free(rb_handle_t _rb) { if (!_rb) { return; } ring_buffer_t *rb = _rb; free(rb->buffer); free(rb); } uint32_t rb_get_free_bytes(rb_handle_t _rb) { ring_buffer_t *rb = _rb; if (rb->head == rb->tail) { return rb->size - 1; } if (rb->head < rb->tail) { return rb->tail - rb->head - 1; } return rb->size - (rb->head - rb->tail) - 1; } uint32_t rb_raw_read_size(rb_handle_t _rb) { ring_buffer_t *rb = _rb; if (rb->head == rb->tail) { return 0; } if (rb->head < rb->tail) { return rb->size - rb->tail; } return rb->head - rb->tail; } const void *rb_raw_read_ptr(rb_handle_t _rb) { ring_buffer_t *rb = _rb; return rb->buffer + rb->tail; } uint32_t rb_raw_read_advance(rb_handle_t _rb, uint32_t size) { if (size) { ring_buffer_t *rb = _rb; rb->tail += size; rb->tail %= rb->size; } return rb_raw_read_size(_rb); } uint32_t rb_raw_write_size(rb_handle_t _rb) { ring_buffer_t *rb = _rb; if (rb->head < rb->tail) { return rb->tail - rb->head -1; } return rb->size - rb->head; } void *rb_raw_write_ptr(rb_handle_t _rb) { ring_buffer_t *rb = _rb; return rb->buffer + rb->head; } uint32_t rb_raw_write_advance(rb_handle_t _rb, uint32_t size) { if (size) { ring_buffer_t *rb = _rb; rb->head += size; rb->head %= rb->size; } return rb_raw_write_size(_rb); }