Files
ipoim/ring_buffer.c
Nikita Tyukalov, ASUS, Linux 8e90c4c152 Implemented basic connection logic
2026-03-25 00:25:47 +03:00

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);
}