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