summaryrefslogtreecommitdiffstats
path: root/app/ring.c
diff options
context:
space:
mode:
authorfishsoupisgood <github@madingley.org>2019-04-29 07:30:28 +0100
committerfishsoupisgood <github@madingley.org>2019-04-29 07:30:28 +0100
commit259ee0e7022ce15f4f2c8294a4fc3de7005d7fab (patch)
treed284293075d882911c2c6a3e982570a7c8aec7e4 /app/ring.c
downloadadapter-259ee0e7022ce15f4f2c8294a4fc3de7005d7fab.tar.gz
adapter-259ee0e7022ce15f4f2c8294a4fc3de7005d7fab.tar.bz2
adapter-259ee0e7022ce15f4f2c8294a4fc3de7005d7fab.zip
working with one set of stripes
Diffstat (limited to 'app/ring.c')
-rw-r--r--app/ring.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/app/ring.c b/app/ring.c
new file mode 100644
index 0000000..26bba3a
--- /dev/null
+++ b/app/ring.c
@@ -0,0 +1,64 @@
+#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;
+}