#include "project.h" static inline size_t ring_next (ring_t *r, size_t p) { p++; if (p >= r->size) p -= r->size; return p; } void ring_init (ring_t *r, uint8_t *buf, size_t len) { r->data = buf; r->size = len; r->write = 0; r->read = 0; } int ring_write_byte (ring_t *r, uint8_t c) { size_t n = ring_next (r, r->write); if (n == r->read) return -1; r->data[r->write] = c; r->write = n; return 0; } int ring_read_byte (ring_t *r, uint8_t *c) { size_t n = ring_next (r, r->read); if (r->read == r->write) return -1; *c = r->data[r->read]; r->read = n; return 0; } int ring_write (ring_t *r, uint8_t *buf, size_t len) { while (len--) { if (ring_write_byte (r, * (buf++))) return -1; } return 0; } int ring_empty (ring_t *r) { return (r->read == r->write) ? 1 : 0; }