100 lines
2.0 KiB
C
100 lines
2.0 KiB
C
#include "ring_buffer.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
|
|
/*
|
|
* 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);
|
|
}
|