diff options
author | root <root@no.no.james.local> | 2017-06-13 21:10:37 +0100 |
---|---|---|
committer | root <root@no.no.james.local> | 2017-06-13 21:10:37 +0100 |
commit | eaf5d4799cc52e9dd1ebcaeafbf8f670658fea98 (patch) | |
tree | bbeb1993818c5fc8cbcf5a001080f246facc8de6 /app/ring.c | |
download | serial_over_dp-eaf5d4799cc52e9dd1ebcaeafbf8f670658fea98.tar.gz serial_over_dp-eaf5d4799cc52e9dd1ebcaeafbf8f670658fea98.tar.bz2 serial_over_dp-eaf5d4799cc52e9dd1ebcaeafbf8f670658fea98.zip |
inital commit
Diffstat (limited to 'app/ring.c')
-rw-r--r-- | app/ring.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/app/ring.c b/app/ring.c new file mode 100644 index 0000000..e3a6209 --- /dev/null +++ b/app/ring.c @@ -0,0 +1,68 @@ +#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_empty (ring_t *r) +{ + return (r->read == r->write); +} + +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; +} |