]> cloudbase.mooo.com Git - z180-stamp.git/blame - include/ring.h
Version 0.6.8.2
[z180-stamp.git] / include / ring.h
CommitLineData
35edb766
L
1/*
2 * (C) Copyright 2014 Leo C. <erbl259-lmu@yahoo.de>
3 *
4 * SPDX-License-Identifier: GPL-2.0+
5 */
6
762a42ef
L
7#ifndef RING_H
8#define RING_H
9
10struct 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
18static inline
19void 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
27static inline
28int 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
44static inline
45int 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
58static inline
59int 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
73static inline
74int_fast8_t ring_is_empty(struct ring *ring)
75{
76 return ring->begin == ring->end;
77}
78
79#endif /* RING_H */