chiark / gitweb /
bd15cd44150f5c7355f99e06f10a956c25ff01ac
[sympathy.git] / src / ring.h
1 /*
2  * ring.h:
3  *
4  * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
5  * All rights reserved.
6  *
7  */
8
9 /*
10  * $Id$
11  */
12
13 /*
14  * $Log$
15  * Revision 1.2  2008/02/12 22:36:46  james
16  * *** empty log message ***
17  *
18  * Revision 1.1  2008/02/08 15:06:42  james
19  * *** empty log message ***
20  *
21  */
22
23 #ifndef __RING_H__
24 #define __RING_H__
25
26 typedef struct
27 {
28   uint8_t *ring;
29   int wptr;
30   int rptr;
31   int size;
32 } Ring;
33
34 #define RING_NEXT(r,a) (((a)+1) % ((r)->size))
35 #define RING_NEXT_R(r) RING_NEXT(r,r->rptr)
36 #define RING_NEXT_W(r) RING_NEXT(r,r->wptr)
37
38 #define RING_EMPTY(r) (((r)->wptr) == ((r)->rptr))
39 #define RING_FULL(r) (RING_NEXT_W(r) == ((r)->rptr))
40
41 static inline int
42 ring_write_one (Ring * r, uint8_t * c)
43 {
44   if (RING_FULL (r))
45     return 0;
46
47   r->ring[r->wptr++] = *c;
48
49   if (r->wptr == r->size)
50     r->wptr = 0;
51
52   return 1;
53 }
54
55 static inline int
56 ring_read_one (Ring * r, uint8_t * c)
57 {
58   if (RING_EMPTY (r))
59     return 0;
60
61   *c = r->ring[r->rptr++];
62
63   if (r->rptr == r->size)
64     r->rptr = 0;
65
66   return 1;
67 }
68
69
70
71 #endif /* __RING_H__ */