#ifndef RINGBUFFER_H #define RINGBUFFER_H #ifdef __cplusplus extern "C" { #endif #include typedef struct { uint32_t head; uint32_t tail; uint32_t size; uint8_t data[]; } ringbuffer; #define RINGBUFFER_STORAGE(NAME, SIZE) uint8_t buf_##NAME##__LINE__[sizeof(ringbuffer) + SIZE]; ringbuffer *NAME = (ringbuffer*)buf_##NAME##__LINE__; #define RINGBUFFER_INIT(NAME, SIZE) NAME->head = NAME->tail = 0; NAME->size = SIZE; #define RINGBUFFER(NAME, SIZE) \ RINGBUFFER_STORAGE(NAME, SIZE); \ RINGBUFFER_INIT(NAME, SIZE); void ringbuffer_rst(ringbuffer *buf); unsigned ringbuffer_capacity(ringbuffer *buf); unsigned ringbuffer_free(ringbuffer *buf); unsigned ringbuffer_level(ringbuffer *buf); unsigned ringbuffer_empty(ringbuffer *buf); unsigned ringbuffer_add(ringbuffer *buf, uint8_t *dat, unsigned len); unsigned ringbuffer_get(ringbuffer *buf, uint8_t *dst, unsigned len); unsigned ringbuffer_peek(ringbuffer *buf, uint8_t *dst, unsigned len); void ringbuffer_skip(ringbuffer *buf, unsigned len); #ifdef __cplusplus } #endif #endif