summaryrefslogtreecommitdiffstats
path: root/app/ring.c
blob: c4f345822e6b6fb24bac6f5e01874ded82773189 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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;
}