summaryrefslogtreecommitdiffstats
path: root/app/ring.c
diff options
context:
space:
mode:
authorfishsoupisgood <github@madingley.org>2020-06-13 21:05:45 +0100
committerfishsoupisgood <github@madingley.org>2020-06-13 21:05:45 +0100
commitd85f3aeeeefd6926fe71ec8e066adb74f62dc1cc (patch)
treefc4e43a80dc50717d41a869dddce20c94a0f25c4 /app/ring.c
downloadrobs_speedo-d85f3aeeeefd6926fe71ec8e066adb74f62dc1cc.tar.gz
robs_speedo-d85f3aeeeefd6926fe71ec8e066adb74f62dc1cc.tar.bz2
robs_speedo-d85f3aeeeefd6926fe71ec8e066adb74f62dc1cc.zip
fish
Diffstat (limited to 'app/ring.c')
-rw-r--r--app/ring.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/app/ring.c b/app/ring.c
new file mode 100644
index 0000000..c4f3458
--- /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_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;
+}