chiark / gitweb /
d0dd3a057470edd89bc4c562db750e15eece183a
[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.1  2008/02/08 15:06:42  james
16  * *** empty log message ***
17  *
18  */
19
20 #ifndef __RING_H__
21 #define __RING_H__
22
23 typedef struct {
24         uint8_t *ring;
25         int wptr;
26         int rptr;
27         int size;
28 } Ring;
29
30 #define RING_NEXT(r,a) (((a)+1) % ((r)->size))
31 #define RING_NEXT_R(r) RING_NEXT(r,r->rptr)
32 #define RING_NEXT_W(r) RING_NEXT(r,r->wptr)
33
34 #define RING_EMPTY(r) (((r)->wptr) == ((r)->rptr))
35 #define RING_FULL(r) (RING_NEXT_W(r) == ((r)->rptr))
36
37 static inline int ring_write_one(Ring *r,uint8_t *c)
38 {
39 if (RING_FULL(r)) return 0;
40
41 r->ring[r->wptr++]=*c;
42
43 if (r->wptr==r->size)
44         r->wptr=0;
45 }
46
47 return 1;
48 }
49
50 static inline int ring_read_one(Ring *r,uint8_t *c)
51 {
52 if (RING_EMPTY(r)) return 0;
53
54 *c=r->ring[r->rptr++];
55
56 if (r->rptr==r->size)
57         r->rptr=0;
58 }
59
60 return 1;
61 }
62
63
64
65 #endif /* __RING_H__ */