diff options
author | root <root@lab2.panaceas.james.local> | 2014-11-02 15:16:42 +0000 |
---|---|---|
committer | root <root@lab2.panaceas.james.local> | 2014-11-02 15:16:42 +0000 |
commit | 479e719a64d75374f00438498cf91ba2601a63f1 (patch) | |
tree | 6f2164598cbe9c78396060dc45f5307172d36a0c /src/ring.c | |
parent | 87e61d21e5ce588c9701d92def188fa97674c3cd (diff) | |
download | stm32_usb_kvm-479e719a64d75374f00438498cf91ba2601a63f1.tar.gz stm32_usb_kvm-479e719a64d75374f00438498cf91ba2601a63f1.tar.bz2 stm32_usb_kvm-479e719a64d75374f00438498cf91ba2601a63f1.zip |
fish
Diffstat (limited to 'src/ring.c')
-rw-r--r-- | src/ring.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/ring.c b/src/ring.c new file mode 100644 index 0000000..4f38e44 --- /dev/null +++ b/src/ring.c @@ -0,0 +1,61 @@ +#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; +} |