Implemented basic connection logic
This commit is contained in:
99
ring_buffer.c
Normal file
99
ring_buffer.c
Normal file
@@ -0,0 +1,99 @@
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user