]> cloudbase.mooo.com Git - z180-stamp.git/blame - include/ring.h
Create include directory
[z180-stamp.git] / include / ring.h
CommitLineData
762a42ef
L
1#ifndef RING_H
2#define RING_H
3
4struct ring {
5 uint8_t *data;
6 uint_fast8_t mask;
7 volatile uint_fast8_t begin;
8 volatile uint_fast8_t end;
9};
10
11
12static inline
13void ring_init(struct ring *ring, uint8_t *buf, int size)
14{
15 ring->data = buf;
16 ring->mask = (size-1) & 0xff;
17 ring->begin = 0;
18 ring->end = 0;
19}
20
21static inline
22int ring_write_ch(struct ring *ring, uint8_t ch)
23{
24 uint_fast8_t ep = ring->end;
25
26 ring->data[ep] = ch;
27 ep = (ep + 1) & ring->mask;
28
29 if ((ep) != ring->begin) {
30 ring->end = ep;
31 return 1;
32 }
33
34 return -1;
35}
36
37#if 0
38static inline
39int ring_write(struct ring *ring, uint8_t *data, int size)
40{
41 int i;
42
43 for (i = 0; i < size; i++) {
44 if (ring_write_ch(ring, data[i]) < 0)
45 return -i;
46 }
47
48 return i;
49}
50#endif
51
52static inline
53int ring_read_ch(struct ring *ring)
54{
55 int ret = -1;
56 uint_fast8_t bp = ring->begin;
57
58 if (bp != ring->end) {
59 ret = ring->data[bp];
60 ring->begin = (bp + 1) & ring->mask;
61 }
62
63 return ret;
64}
65
66
67static inline
68int_fast8_t ring_is_empty(struct ring *ring)
69{
70 return ring->begin == ring->end;
71}
72
73#endif /* RING_H */
74